如何筛选每个customer_id除首行外的重复客户数据?
获取客户表中重复客户的后续记录
假设你的customer表包含customer_id、month以及其他客户详情字段,要筛选出每个customer_id第二次及以后出现的行,可以用窗口函数快速实现:
核心思路
通过ROW_NUMBER()窗口函数为每个客户的记录按顺序编号,然后过滤掉编号为1的首条记录,剩下的就是目标数据。
完整SQL查询
SELECT * FROM ( SELECT *, -- 按customer_id分组,按月份排序生成行号 ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY month) AS row_num FROM customer ) AS ranked_cust WHERE row_num > 1;
细节说明
PARTITION BY customer_id:将数据按客户ID拆分,每个客户的记录单独处理ORDER BY month:指定分组内的排序规则,确保行号按时间先后分配(如果你的表用其他字段标记记录顺序,比如自增IDid,直接替换month即可)- 子查询生成的
row_num字段标记了每个客户的记录顺序,外层查询筛选row_num > 1,就能得到每个客户第二次及以后的所有记录
如果需要保留重复次数的信息,也可以把ROW_NUMBER()换成COUNT()或者RANK(),但ROW_NUMBER()是最适合这个需求的。
内容的提问来源于stack exchange,提问作者astha jain
相关产品推荐
相关产品推荐

