web-dev-qa-db-ja.com

ランク(RowNumber)とグループのSQL Serverクエリ

列がいくつかあるテーブルがあります:ユーザー、カテゴリ、値

そして、値によってすべてのユーザーのランキングを取得するクエリを作成しますが、カテゴリについてはリセットします。

例:

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

クエリは次を返します:

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

何か案は?

クエリを作成してカテゴリを指定します。機能しますが、ループとその非常に遅いものを作成する必要があります。

22
bladefist

ランキング関数で「Partition by」を使用する 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

値に重複がある可能性がある場合は、デュープを「カウント」する(RANKと同等)か、カウントしない(DENSE_RANKと同等、thanx @shannon)かを決定する必要があります。

普通ランク:

 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 

「密」ランク:

 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