如何删除表中除前5条以外的所有记录

2024-03-28 12:03:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python编写一个简单的问答游戏,我需要在游戏结束时打印出前5名的分数。我正在使用sqlite。我有一个表的最高分数,我已经制定了如何获得最高的分数,但因为我只需要前5名的分数,我想删除所有记录的分数低于前5名。这是否可以用SQL语句实现,或者我需要用python编写它。你知道吗

谢谢


Tags: 游戏sqlitesql记录语句分数
2条回答

这里有一个选项:

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。你知道吗

我对带有子查询的NOT IN有强烈的反感,因为如果score值中的任何为负数,它的行为就不符合预期。所以我建议:

DELETE FROM t
WHERE score < (SELECT DISTINCT t2.score
                FROM t2
                ORDER BY t2.score DESC
                LIMIT 1 OFFSET 4
               );

相关问题 更多 >