Подтвердить что ты не робот

Запрос SQL Server для ранжирования (RowNumber) и группировки

У меня есть таблица с несколькими столбцами: User, Category, Value

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

Пример:

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

Любые идеи?

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

4b9b3361

Ответ 1

Используйте "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

Ответ 2

 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