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

如何通过SQL删除冗余客户状态行,仅保留状态变更相关记录?

保留客户状态变化记录的SQL实现

要仅保留客户状态发生变化的记录,我们可以利用窗口函数LAG()对比同一客户的当前状态与前一条记录的状态,筛选出需要保留的记录后,删除其余条目。

步骤1:查询需要保留的记录

先确认哪些记录是需要保留的——每个客户的第一条记录,以及状态与上一条不同的记录:

SELECT *
FROM (
    SELECT 
        *,
        -- 获取同一客户的上一条状态
        LAG(Status) OVER (PARTITION BY `Customer ID` ORDER BY Date) AS prev_status
    FROM your_table_name
) AS sub
-- 保留第一条记录,或状态发生变化的记录
WHERE prev_status IS NULL OR Status != prev_status;

步骤2:删除不需要的记录

根据不同数据库的语法,删除不在保留列表中的记录:

MySQL/PostgreSQL

DELETE FROM your_table_name
WHERE ID NOT IN (
    SELECT ID
    FROM (
        SELECT 
            ID,
            LAG(Status) OVER (PARTITION BY `Customer ID` ORDER BY Date) AS prev_status
        FROM your_table_name
    ) AS sub
    WHERE prev_status IS NULL OR Status != prev_status
);

SQL Server

WITH keep_list AS (
    SELECT 
        ID,
        LAG(Status) OVER (PARTITION BY [Customer ID] ORDER BY Date) AS prev_status
    FROM your_table_name
)
DELETE FROM your_table_name
WHERE ID IN (
    SELECT ID FROM keep_list
    WHERE prev_status IS NOT NULL AND Status = prev_status
);

结果验证

运行上述语句后,你的表将仅保留ID为1、4、5、9的记录,符合预期需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:30:28