首页 > 解决方案 > 如何从表中删除除前 5 名之外的所有记录

问题描述

我正在用python编写一个简单的问答游戏,我需要在游戏结束时打印出前5个分数。我正在使用sqlite。我有一个最高分表,我已经弄清楚了如何获得最高分,但是因为我只需要前 5 个分数,所以我想删除所有分数低于前 5 个的记录。这可能用 SQL声明还是我需要用python编写它。

谢谢

标签: pythonsqlsqlite

解决方案


这是一种选择:

DELETE
FROM yourTable
WHERE score NOT IN (SELECT DISTINCT score
                    FROM yourTable
                    ORDER BY score DESC LIMIT 5);

这个答案对于前 5 名的平局来说是稳健的,但会返回可能超过 5 条记录的行为,所有这些记录的得分都在前 5 名中。

如果ROW_NUMBER可用,我们可以尝试以下方法:

WITH cte AS (
    SELECT id, score, ROW_NUMBER() OVER (ORDER BY score DESC) rn
    FROM yourTable
)

DELETE
FROM yourTable
WHERE id IN (SELECT id FROM cte WHERE rn <= 5);

同样,存在如何处理关系的问题。您可能实际上想要使用DENSE_RANK而不是ROW_NUMBER.


推荐阅读