如何检索ID与Start日期组合重复的对应数据?
检索ID与Start日期重复的记录方法
要筛选出ID和Start日期组合重复出现的所有记录(即保留(ID, Start)对出现次数≥2的全部行),可以用以下几种SQL实现方式:
方法1:窗口函数COUNT() OVER()(推荐,直观高效)
SELECT ID, Start FROM ( SELECT ID, Start, -- 按ID和Start分组,统计每组的行数 COUNT(*) OVER (PARTITION BY ID, Start) AS duplicate_count FROM your_table_name -- 替换为你的实际表名 ) AS temp WHERE duplicate_count > 1 ORDER BY ID, Start;
逻辑:子查询为每一行标记其所属(ID, Start)组的总行数,外层筛选计数大于1的行,即可得到所有重复记录。
方法2:GROUP BY + JOIN
SELECT t.ID, t.Start FROM your_table_name t INNER JOIN ( -- 先找出所有重复的(ID, Start)组合 SELECT ID, Start FROM your_table_name GROUP BY ID, Start HAVING COUNT(*) > 1 ) AS duplicate_pairs ON t.ID = duplicate_pairs.ID AND t.Start = duplicate_pairs.Start ORDER BY t.ID, t.Start;
逻辑:先通过分组查询得到所有重复的(ID, Start)组合,再通过关联查询取出原表中属于这些组合的所有行。
方法3:EXISTS子查询
如果表有唯一主键(比如row_id),可以用这种方式:
SELECT ID, Start FROM your_table_name t1 WHERE EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t1.ID = t2.ID AND t1.Start = t2.Start AND t1.row_id != t2.row_id -- 排除自身匹配 ) ORDER BY ID, Start;
逻辑:对每一行,检查是否存在另一行与它的ID、Start完全相同但不是同一行,满足条件则保留该行。
示例验证
用你提供的测试数据执行上述任意SQL,都会得到期望输出:
ID Start 0001 31JAN2015 0001 31JAN2015 0004 31DEC2016 0004 31DEC2016
内容的提问来源于stack exchange,提问作者NewUsr
相关产品推荐
相关产品推荐

