SQLite中删除pages_dataupload表重复行保留最后一条的SQL查询问题
解决SQLite删除重复行(保留最后一条)的问题
你写的SQL存在几个关键问题:
- 分区逻辑错误:要基于
customer_number去重,PARTITION BY应该仅指定customer_number,而非id, customer_number(若id是主键则本身唯一,这样分区后每一行都是独立组,无法识别重复项) - 排序逻辑错误:要保留最后一条记录,需按
id DESC排序(假设id是自增主键,值越大代表记录越新),这样row_num=1会对应每个customer_number的最新记录 - SQLite语法限制:不能直接在
DELETE的WHERE子句中引用CTE的row_num字段,需通过关联CTE的id来定位待删除行
以下是修正后的可执行代码,适配Django的cursor调用:
cursor = connection.cursor() cursor.execute(''' WITH cte AS ( SELECT id, customer_number, ROW_NUMBER() OVER ( PARTITION BY customer_number ORDER BY id DESC -- 按id倒序,确保保留最新的一条记录 ) row_num FROM pages_dataupload ) DELETE FROM pages_dataupload WHERE id IN (SELECT id FROM cte WHERE row_num > 1); ''') # 手动提交事务(若Django未配置自动提交) connection.commit()
补充说明:
- 若你判断“最后一条”的依据不是
id,而是时间字段(如create_time),将ORDER BY id DESC替换为ORDER BY create_time DESC即可 - 该方法利用窗口函数批量处理,相比ORM逐行操作更适合大表场景
- 需确保SQLite版本在3.25.0及以上,因为
ROW_NUMBER()窗口函数从该版本开始支持
内容的提问来源于stack exchange,提问作者Islam Fahmy
相关产品推荐
相关产品推荐

