如何使用SQL按分组查找重复值?
你现在的写法是直接全局按customer字段分组,所有相同客户无论出现顺序都会被归到同一分组,自然得不到你要的仅连续相同客户才递增序号的效果。这个场景属于SQL典型的「孤岛分组」问题,正确实现逻辑如下:
实现代码
WITH mark_group AS ( -- 标记出客户和上一行不同的行,作为新分组的起点 SELECT *, CASE WHEN customer = LAG(customer) OVER(ORDER BY id) THEN 0 ELSE 1 END AS group_flag FROM customers ), calc_group_id AS ( -- 累加标记值生成连续相同客户的专属分组ID SELECT *, SUM(group_flag) OVER(ORDER BY id) AS group_id FROM mark_group ) -- 每个连续分组内排序得到期望的rank值 SELECT id, customer, ROW_NUMBER() OVER(PARTITION BY group_id ORDER BY id) AS `rank` FROM calc_group_id ORDER BY id;
执行结果
完全匹配你给出的预期输出:
| id | customer | rank |
|---|---|---|
| 1 | customer_1 | 1 |
| 2 | customer_2 | 1 |
| 3 | customer_2 | 2 |
| 4 | customer_1 | 1 |
| 5 | customer_3 | 1 |
| 6 | customer_1 | 1 |
如果你需要直接提取重复行,在外层追加WHERE rank > 1过滤条件即可得到所有连续重复的记录。
内容的提问来源于stack exchange,提问作者Jora
相关产品推荐
相关产品推荐

