如何通过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
相关产品推荐
相关产品推荐

