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

SQLite3股票价格表中连续相似记录的删除方案问询

解决SQLite中删除股票价格表重复记录的问题

嘿,这个需求我之前帮朋友处理过类似的——就是要清理那些只有DateTime不同,但Bid和Ask完全一致的重复组,每组只留一条记录对吧?给你两个实用的方案,你可以根据自己表的大小来选:

方案一:用窗口函数精准删除(SQLite 3.25+适用)

这个方法比较直观,先给每组重复记录(按Bid、Ask分组)编号,然后删掉编号大于1的记录。操作前建议先预览要删除的内容,避免误删:

1. 预览待删除的记录

WITH ranked_records AS (
    SELECT 
        DateTime,
        Bid,
        Ask,
        -- 按Bid和Ask分组,给每组内的记录按DateTime排序编号
        ROW_NUMBER() OVER (PARTITION BY Bid, Ask ORDER BY DateTime) AS rn
    FROM table_name
)
SELECT * FROM ranked_records WHERE rn > 1;

2. 执行删除操作

确认预览结果没问题后,就可以删除重复记录了:

WITH ranked_records AS (
    SELECT 
        DateTime,
        ROW_NUMBER() OVER (PARTITION BY Bid, Ask ORDER BY DateTime) AS rn
    FROM table_name
)
DELETE FROM table_name
WHERE DateTime IN (SELECT DateTime FROM ranked_records WHERE rn > 1);

注:这里假设你的DateTime字段是唯一的(每条记录的时间都不一样),如果不是,可能需要结合主键来匹配记录,避免误删。

方案二:临时表批量替换(超大型表更高效)

如果你的表数据量特别大,用窗口函数的删除可能会比较慢,这时候可以用临时表先保存需要保留的记录,再批量替换原表数据:

-- 1. 创建临时表,只保留每组重复记录中最早的一条(也可以用MAX(DateTime)留最新的)
CREATE TEMP TABLE temp_keep AS
SELECT MIN(DateTime) AS DateTime, Bid, Ask
FROM table_name
GROUP BY Bid, Ask;

-- 2. 清空原表数据
DELETE FROM table_name;

-- 3. 将临时表中要保留的记录插回原表
INSERT INTO table_name (DateTime, Bid, Ask)
SELECT DateTime, Bid, Ask FROM temp_keep;

-- 4. 删除临时表(可选,SQLite关闭连接后会自动删除)
DROP TABLE temp_keep;

这个方法的优势是批量操作效率更高,适合百万级以上的大表。

重要提醒

不管用哪种方法,操作前一定要备份原表数据!删除操作是不可逆的,万一误删了重要数据就麻烦了。如果表中还有其他字段(比如成交量、其他报价字段),只要这些字段和Bid、Ask一起重复,记得把它们也加入PARTITION BY(方案一)或者GROUP BY(方案二)中哦。

内容的提问来源于stack exchange,提问作者SaeedMMX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:10:16