首页 > 解决方案 > 无论如何要在 Sqlite3 的有序查询中获取特定行的位置?

问题描述

假设我的基于 sqlite3 的应用程序有一个排行榜。所有用户都有一个级别,并且有成千上万的用户。如果我想获得排行榜,我会查询限制为 10 的用户,并按降序排列。现在可以了。但是,如果我希望排行榜中有第 11 个用户,但不是第 11 个最大级别的人,该怎么办。它是执行检查排行榜的用户。我希望他们成为他们拉排行榜并查看排名前 10 位的用户的一种方式,但看到自己排在第 11 位,他们在哪里。这就是我不知道该怎么做。我如何在不查询整个数据库的情况下获得该用户与其他人相比的位置、位置。如果选择整个数据库效率太低,我的应用程序有近 10 万行用户。

这是我希望它看起来像的示例(为简单起见,将排行榜设为 5 长而不是 10 长)

1. BobBobman123 (lvl 104)
2. Jin73 (lvl 99)
3. iefa44 (lvl 78)
4. jobSteve_8 (lvl 68)
5. david4 (lvl 61)
143. harrypotter64 (lvl 7)

例如,我想要完成的事情是能够获得 harrypotter64(检查排行榜的人)的位置。本例中的位置是143.

标签: pythonsqlite

解决方案


窗口功能来拯救!(需要 sqlite 3.25 或更高版本)。就像是

WITH ranked AS
 (SELECT dense_rank() OVER (ORDER BY level DESC) AS position
       , username, level
  FROM leaderboard)
SELECT *
FROM ranked
WHERE position <= 10 OR username = 'harrypotter64'
ORDER BY position

使用索引leaderboard(level DESC)以提高效率。


推荐阅读