SQL分组查找SIZEPOS重复的CODE记录时返回重复行问题排查
问题原因
你当前查询出现重复结果的核心问题如下:
- 你贴出的
GROUP BY语句逻辑上本应让相同的(CODE, ITEID, SIZEPOS)组合仅返回1行,若执行后出现重复行,大概率是你实际运行的查询中,SELECT子句额外加入了其他不属于分组维度、也未被聚合的字段,导致分组规则失效,同一组合被拆分为多行返回。 - 如果你原本的需求是查询所有符合重复条件的原始记录行,当前的分组写法只能返回每个重复组合的聚合结果,无法匹配需求。
修正方案
场景1:仅需要返回每个重复组合的聚合结果
你原本的写法逻辑是正确的,只需要检查SELECT子句中没有多余的非分组、非聚合字段即可,参考语句:
SELECT CODE, ITEID, SIZEPOS, COUNT(SIZEPOS) AS CNT FROM @SUBSTITUTE GROUP BY CODE, ITEID, SIZEPOS HAVING COUNT(SIZEPOS) > 1;
场景2:需要返回所有出现重复的原始记录行
使用窗口函数标记重复行即可实现需求,参考语句:
SELECT CODE, ITEID, SIZEPOS FROM ( SELECT CODE, ITEID, SIZEPOS, COUNT(*) OVER (PARTITION BY CODE, ITEID, SIZEPOS) AS repeat_cnt FROM @SUBSTITUTE ) AS temp WHERE repeat_cnt > 1;
如果需要对结果去重,只需要在SELECT后加上DISTINCT关键字即可。
内容的提问来源于stack exchange,提问作者Faye D.
相关产品推荐
相关产品推荐

