假设我有一个包含100万个视频游戏高分的表格,其中包含整数列score
。当用户要求获得前50个分数时,我会select * from highscores order by score desc limit 50
。简单。但是,如果用户要求51到100分,该怎么办?我可以选择前100名然后,在我的程序接口数据库中,忽略前50行;但那会很浪费。如果他们要求第200000行到第200100行怎么办?效率低下只会变得更糟。
答案 0 :(得分:1)
您可以使用 row_number()来获取行范围
with topScores as
(
select *,row_number() over(order by score desc) rowNum from highscores
)
select * from topScores where (rowNum between 1 and 100) -- or rowNum between 101 and 200
或使用 Dense_Rank()来考虑与同一订单相同分数的游戏 - 如下所示
with topScores as
(
select *,dense_rank() over(order by score desc) scoreOrder from highscores
)
select * from topScores where (scoreOrder between 1 and 100) -- or scoreOrder between 101 and 200
你可以使用OFFSET Fetch Clause(但它不会考虑与一个订单相同分数的游戏) 此示例将高分行从101到200
SELECT * FROM highscores ORDER BY score Desc OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;
答案 1 :(得分:0)
您可以查询另一个查询的结果 - 看起来您必须始终选择较大数字的大小:
select * from (
select * from highscores order by score desc limit 100
)
order by score asc limit 50
在这里,我们选择前100个分数,然后我们从该组中选择50个最低分数。
<小时/> 更好的解决方案是在分数列中添加索引,如果您想要排名前x
到y
个高分,则只需选择行x
到行y
的所有内容。有关按范围选择行的信息,请参阅this question。