web-dev-qa-db-fra.com

Requête SQL Server pour le rang (Row_Number) et les regroupements

J'ai une table qui a quelques colonnes: utilisateur, catégorie, valeur

Et je veux faire une requête qui me donnera un classement, de tous les utilisateurs par la valeur, mais réinitialisé pour la catégorie.

Exemple:

user1   CategoryA 10
user2   CategoryA 11
user3   CategoryA 9
user4   CategoryB 3
user1   CategoryB 11

la requête retournerait:

Rank  User   Category  
1     user2   CategoryA
2     user1   CategoryA
3     user3   CategoryA
1     user1   CategoryB
2     user4   CategoryB

Des idées?

J'écris la requête et spécifie la catégorie, ça fonctionne mais ensuite je dois écrire des boucles et c'est très lent.

22
bladefist

Utilisez "Partition by" dans la fonction de classement clause OVER

SELECT
    Rank() over (Partition by Category Order by Value, User, Category) as ranks,
    Category, User
FROM 
    Table1
Group By
    User, Category, Value 
Order by
    ranks asc
44
gbn
 Select User, Category,
     (Select Count(*) From Table 
      Where Category = A.Category 
         And Value <= A.Value) Rank
 From Table A
 Order By Category, Value

Si Value peut avoir des doublons, alors vous devez décider si vous voulez "compter" les dupes (équivilent à RANK) ou non (équivilent à DENSE_RANK, merci @shannon)

Rang ordinaire:

 Select User, Category,
     (Select 1 + Count(*) From Table -- "1 +" gives 1-based rank, 
      Where Category = A.Category    -- take it out to get 0-based rank
         And Value < A.Value) Rank
 From Table A
 Order By Category, Value 

Rang "dense":

 Select User, Category,
     (Select 1 + Count(Distinct Value) -- "1 +" gives 1-based rank, 
      From Table                       -- take it out to get 0-based rank
      Where Category = A.Category    
         And Value < A.Value) Rank
 From Table A
 Order By Category, Value
3
Charles Bretana