排名窗口函数似乎是显而易见的答案,顺便说一句,分区依据是可选的
create table t
(player_id int, value int);
insert into t values
( 10 , 333 ),
( 11 , 31 ),
( 15 , 12 ),
( 9 , 3 ),
( 1 , 0 ),
( 8 , 0 ),
( 12 , 0 ),
( 13 , 0 ),
( 14 , 0 );
select *,
rank() over (order by value desc)
from t
+-----------+-------+-----------------------------------+
| player_id | value | rank() over (order by value desc) |
+-----------+-------+-----------------------------------+
| 10 | 333 | 1 |
| 11 | 31 | 2 |
| 15 | 12 | 3 |
| 9 | 3 | 4 |
| 13 | 0 | 5 |
| 14 | 0 | 5 |
| 1 | 0 | 5 |
| 8 | 0 | 5 |
| 12 | 0 | 5 |
+-----------+-------+-----------------------------------+
9 rows in set (0.001 sec)
如果你只想要 11,请将代码放入 cte
with cte as
(select *,
rank() over (order by value desc) rnk
from t
)
select player_id, rnk
from cte
where player_id = 11;