如何在有序表中选择行并检索其上方和下方的许多行?

时间:2019-01-12 20:59:43

标签: sqlite

因此,我有一个大型数据库,我想按某个值对其进行排序,例如“ earned_points”,并使用userID在有序表中查找用户的积分。在表中找到用户后,例如,要检索他上方的5个用户和他下方的5个用户,以在我的代码中创建并显示排名表。

现在,我尝试通过创建具有等级的视图表(具有窗口函数:OVER()和row_number()),然后从临时表中选择等级,来完成此操作,

CREATE VIEW temp_table AS
SELECT *, row_number() OVER (ORDER BY earned_points) FROM myTable;

SELECT id FROM temp_table WHERE rank > foundRank - 5 AND rank < foundRank + 5;

,但是整个查询以及创建视图表的过程在我的数据库中都非常缓慢。有什么简单快捷的方法可以做到这一点吗?我需要查询的长度不超过10毫秒。

1 个答案:

答案 0 :(得分:0)

在您的特定情况下可能会或可能不会起作用的简单想法:根据当前用户得分附近的窗口进行选择:

SELECT * FROM myTable
  WHERE earned_points > current_user_earned_points - X
        AND earned_points < current_user_earned_points + X
  ORDER BY earned_points

以合理的值X。这样的想法是,您通常会选择比您需要的人更多的人,但是您只会在玩家附近显示这些人。假设分数分布是线性的,否则您可以选择X作为earned_points的函数。

根据表的大小,即使您选择了数十个不必要的条目,这也可能会快很多,因为不需要执行row_number

缺点是此方法未给出确切的排名。尽管如果您的表中实际上包含成千上万的玩家,那可能并不重要-您可以计算出一个正确的估计值,并将其显示为用户的“排名”,除非他们接近顶部。

如果还没有,请确保在earned_points上创建索引。如建议的那样,也许您需要使用INDEXED BY。在this SO answer中。