You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 06:57:14