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