2010-06-15 5 views
1

j'ai une table avec quelque chose comme ce qui suit:Obtenir des résultats filtrés avec sous-requête

ID Name Color 
------------ 
1 Bob Blue 
2 John Yellow 
1 Bob Green 
3 Sara Red 
3 Sara Green 

Ce que je voudrais faire est de retourner une liste filtrée des résultats dans lequel les données suivantes sont renvoyées:

ID Name Color 
------------ 
1 Bob Blue 
2 John Yellow 
3 Sara Red 

Par exemple, je voudrais retourner 1 ligne par utilisateur. (Je ne me dérange pas quelle ligne est retournée pour l'utilisateur particulier - je ai juste besoin que [ID] est unique.) J'ai déjà quelque chose qui fonctionne mais est vraiment lent où je crée une table temporaire en ajoutant tous les ID, puis en utilisant un « OUTER APPLY » sélectionner le top 1 de la même table, à savoir

CREATE TABLE #tb 
( 
    [ID] [int] 
) 

INSERT INTO #tb 
select distinct [ID] from MyTable 

select 
    T1.[ID], 
    T2.[Name], 
    T2.Color 
from 
    #tb T1 
    OUTER APPLY 
    (
     SELECT TOP 1 * FROM MyTable T2 WHERE T2.[ID] = T1.[ID] 
    ) AS V2 


DROP TABLE #tb 

quelqu'un peut-il suggérer comment je peux l'améliorer?

Merci

Répondre

1

Essayez:

WITH CTE AS 
(
SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) AS 'RowNo', 
ID, Name, Color 
FROM table 
) 
SELECT ID,Name,color 
FROM CTE 
WHERE RowNo = 1 

ou

select 
    * 
from 
(
    Select 
     ID, Name, Color, 
     rank() over (partition by Id order by sum(Name) desc) as Rank 
    from 
     table 
    group by 
     ID 
) 
    HRRanks 
where 
    rank = 1 
+0

J'ai utilisé le premier exemple - fantastique !! Merci. – jose

Questions connexes