select * from (
select
p.*,
@rank:=IF(@prev_score != score, @rank + 1, @rank) as rank,
@prev_score := score
from
people p
, (select @rank:=1, @prev_score:=null) var_init
order by score desc
) sq where rank = 5;
這是MySQL的帶電作業。你的問題被標記爲MySQL,但是在你的sqlfiddle中你指定了SQL Server。
對於SQL Server會是這樣:
; with cte as (
select
p.*,
rank() over (order by score desc) as my_rank
from
people p
) select * from cte where my_rank = 5;
UPDATE:
select * from (
select
p.*,
@rank:=IF(@prev_score != score, @rank + 1, @rank) as rank,
@prev_score := score
from
people p
, (select @rank:=1, @prev_score:=null) var_init
order by score desc
) sq where name = 'whatever';
我不太確定你的方法是一個糟糕的一個。但是你可以在SQL中使用變量來高效地執行此操作以跟蹤等級。 – Strawberry
如果你不需要做{SELECT * FROM}不要使用它。選擇需要查詢的列將爲數據庫帶來速度。我不知道你是否需要查詢所有列。 – Mubo