Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从表中删除除前5项以外的所有记录_Python_Sql_Sqlite - Fatal编程技术网

Python 如何从表中删除除前5项以外的所有记录

Python 如何从表中删除除前5项以外的所有记录,python,sql,sqlite,Python,Sql,Sqlite,我正在用python编写一个简单的问答游戏,我需要在游戏结束时打印出前5名的分数。我正在使用sqlite。我有一个关于最高分数的表格,我已经计算出如何获得最高分数,但因为我只需要前5名的分数,我想删除所有分数低于前5名的记录。这可以通过SQL语句实现,还是需要用python编写 谢谢这里有一个选项: DELETE FROM yourTable WHERE score NOT IN (SELECT DISTINCT score FROM yourTable

我正在用python编写一个简单的问答游戏,我需要在游戏结束时打印出前5名的分数。我正在使用sqlite。我有一个关于最高分数的表格,我已经计算出如何获得最高分数,但因为我只需要前5名的分数,我想删除所有分数低于前5名的记录。这可以通过SQL语句实现,还是需要用python编写

谢谢这里有一个选项:

DELETE
FROM yourTable
WHERE score NOT IN (SELECT DISTINCT score
                    FROM yourTable
                    ORDER BY score DESC LIMIT 5);
这个答案对于前5名的平局来说是可靠的,但可能会返回5条以上的记录,所有这些记录的总分都在前5名

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

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);

同样,还有如何处理关系的问题。实际上,您可能希望使用密集秩而不是行数。

我强烈反对不使用子查询,因为如果任何分数值为负数,它的行为就不会像预期的那样。因此,我建议:

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

前五名中会有两个或两个以上的分数恰好持平吗?这里你真正想用的是行号,但这在SQLite AFAIK中并不存在。@TimBiegeleisen您可以通过左键将表连接到score=3.25,来自SQLite,具有行数功能:-你怎么没用身份证?id未按顺序插入选择idscore@CaiusJard这里的排名是基于分数,而不是其他id。我明白了,但是如果只有分数1和分数2-没有数据会被删除?是的…这两个值在前5位,为什么要删除任何内容?我的意思是,如果有10行有分数:1,1,2,2,2,2,2,2,那么在删除操作之后,表仍将有10行。。我很好奇为什么你要用一个非主键来标识要删除的行,而期望的最终结果是有一个表,其中有5行得分最高,我的解释和删除所有非id的行可以实现这一点?我想这是关于领带的处理;你们保持联系,即使这意味着有5个以上的赢家,我要取消他们,只会导致5个赢家,给撒迦利亚·泽德森带来厄运,她与亚当并列第5名Adams@CaiusJard . . . 非常感谢。这毕竟是一个删除。