22

ユーザー、カテゴリ、値の列を持つテーブルがあります

そして、すべてのユーザーのランキングを値で表示するクエリを作成しますが、カテゴリはリセットします。

例:

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

何か案は?

クエリを記述してカテゴリを指定します。これは機能しますが、ループを記述しなければならず、非常に時間がかかります。

4

2 に答える 2

44

ランキング関数のOVER 句で「Partition by」を使用する

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
于 2009-07-16T19:24:19.343 に答える
3
 Select User, Category,
     (Select Count(*) From Table 
      Where Category = A.Category 
         And Value <= A.Value) Rank
 From Table A
 Order By Category, Value

Valueに重複がある可能性がある場合は、重複を「カウント」するか(RANKと同等)、しないか(DENSE_RANKと同等、@ 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
于 2009-07-16T19:21:21.767 に答える