Запрос SQL Server для ранга (RowNumber) и группировок - PullRequest
22 голосов
/ 16 июля 2009

У меня есть таблица, в которой есть несколько столбцов: Пользователь, Категория, Значение

И я хочу сделать запрос, который даст мне рейтинг всех пользователей по значению, но будет сброшен для категории.

Пример:

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

Есть идеи?

Я пишу запрос и указываю категорию, она работает, но потом мне приходится писать циклы, и она очень медленная.

Ответы [ 2 ]

44 голосов
/ 16 июля 2009

Использовать "Разделение по" в функции ранжирования Предложение 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
3 голосов
/ 16 июля 2009
 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, спасибоx @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
...