如何从数据表中获取Top 1组重复数据?
获取重复次数最多的Top1组数据
要实现从xyz表中提取重复次数最多的一组数据(以Name、Mobile、Email的组合作为重复判定依据),且无重复数据时输出空,可以通过以下SQL方案实现:
方案1:输出所有重复次数最多的组(支持并列)
如果存在多个组重复次数相同且均为最大值,该方案会输出所有这些组的全部记录:
SELECT x.* FROM xyz x -- 统计每个组合的重复次数 JOIN ( SELECT Name, Mobile, Email, COUNT(*) AS cnt FROM xyz GROUP BY Name, Mobile, Email ) AS grouped ON x.Name = grouped.Name AND x.Mobile = grouped.Mobile AND x.Email = grouped.Email -- 找到最大的重复次数 JOIN ( SELECT MAX(cnt) AS max_cnt FROM ( SELECT COUNT(*) AS cnt FROM xyz GROUP BY Name, Mobile, Email ) AS counts ) AS max_counts ON grouped.cnt = max_counts.max_cnt -- 过滤无重复的情况 WHERE max_counts.max_cnt > 1;
方案2:仅输出重复次数最多的单个组(按指定规则取Top1)
如果需要在多个并列的最大重复组中仅取一组(比如按Name、Mobile字母顺序排序后的第一个),可以使用窗口函数实现:
SELECT x.* FROM xyz x JOIN ( -- 对每个组按重复次数降序、Name和Mobile升序排序,取排名第一的组 SELECT Name, Mobile, Email FROM ( SELECT Name, Mobile, Email, COUNT(*) AS cnt, ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC, Name, Mobile) AS rn FROM xyz GROUP BY Name, Mobile, Email ) AS ranked -- 只保留重复次数>1且排名第一的组 WHERE rn = 1 AND cnt > 1 ) AS top_group ON x.Name = top_group.Name AND x.Mobile = top_group.Mobile AND x.Email = top_group.Email;
示例验证
对于你提供的第一组测试数据,方案2会输出Name=k1、Mobile=900000000、Email=k1@gmail.com的两条记录,与期望输出一致;当表中无重复数据时,两个方案都会返回空结果。
内容的提问来源于stack exchange,提问作者user3754858
相关产品推荐
相关产品推荐

