2009-10-26 3 views
0

Je suis en train d'obtenir les dossiers top N pour chaque ligne unique de données dans une table (je groupant sur les colonnes b, c et d, colonne un est l'identifiant unique et la colonne e est le score dont je veux le top 1 dans ce cas).finding Haut n pour chaque ligne unique

a b c d e 
2 38 NULL NULL 141 
1 38 NULL NULL 10 
1 38 1 NULL 10 
2 38 1 NULL 1 
1 38 1 8 10 
2 38 1 8 1 
2 38 16 NULL 140 
2 38 16 12 140 

par exemple. à partir de ces données, je voudrais trouver les lignes suivantes:

a b c d e 
2 38 NULL NULL 141 
1 38 1 NULL 10 
1 38 1 8 10 
2 38 16 NULL 140 
2 38 16 12 140 

quelqu'un peut-il s'il vous plaît me diriger dans la bonne direction pour résoudre ce problème?

Répondre

1

Votre exemple ne montre pas, et vous n'expliquent pas comment vous déterminez row est le "top", donc j'ai mis ?????? dans la requête où vous devez fournir une colonne de classement, telle que

a desc 

par exemple. Dans tous les cas, c'est exactement ce que les fonctions d'analyse dans SQL Server 2005 et versions ultérieures sont destinées.

declare @howmany int = 3; 
with TRanked (a,b,c,d,e,rk) as (
    select 
    a,b,c,d,e, 
    rank() over (
     partition by b,c,d 
     order by ??????? 
    ) 
    from T 
) 
    select a,b,c,d,e 
    from TRanked 
    where rk <= @howmany; 
+0

cela fonctionne très bien. Je savais que je cherchais la fonction de grade cte + mais la terminologie m'échappait – mjallday

0

Les valeurs nulles sont une douleur, mais quelque chose comme ceci:

select * from table1 t1 
where a in (
    select top 1 a from table1 t2 
    where (t1.b = t2.b or (t1.b is null and t2.b is null)) 
    and (t1.c = t2.c or (t1.c is null and t2.c is null)) 
    and (t1.d = t2.d or (t1.d is null and t2.d is null)) 
    order by e desc 
) 

ou mieux encore:

select * from (
    select *, seqno = row_number() over (partition by b, c, d order by e desc) 
    from table1 
) a 
where seqno = 1 
0

Je crois que cela va faire ce que vous avez dit (étendre l'idée de here):

select b,c,d,e, 
rank() over 
(partition by b,c,d order by e desc) "rank" 
from t1 where rank < 5 

Vive.

Questions connexes