编写SQL识别分组内多子分组,排查插入操作重复键报错问题
符合需求的SQL查询方案
你可以使用以下两种写法实现需求,两种写法均可返回所有存在多组Company/Code组合的State/Zone分组下的全部原始记录:
写法1:分组过滤关联法(兼容性更好)
WITH BadStateZoneGroups AS ( -- 筛选出存在多组不同Company/Code组合的异常State/Zone分组 SELECT State, Zone FROM Companies GROUP BY State, Zone HAVING COUNT(DISTINCT CONCAT(Company, N'☠', Code)) > 1 ) -- 关联返回异常分组下的全部原始记录 SELECT c.RecordNumber, c.State, c.Zone, c.Company, c.Code, c.Revenue FROM Companies c INNER JOIN BadStateZoneGroups bg ON c.State = bg.State AND c.Zone = bg.Zone ORDER BY c.RecordNumber;
注:CONCAT拼接时使用的特殊分隔符请确保不会出现在Company和Code字段的取值中,避免出现不同组合拼接后结果相同的误判。
写法2:窗口函数法(无需拼接字段,更稳妥)
WITH CompanyGroupRank AS ( SELECT *, -- 同一个State/Zone分组下,不同的Company/Code组合会生成不同的排名 DENSE_RANK() OVER( PARTITION BY State, Zone ORDER BY Company, Code ) AS combination_rank FROM Companies ) SELECT RecordNumber, State, Zone, Company, Code, Revenue FROM CompanyGroupRank WHERE EXISTS ( SELECT 1 FROM CompanyGroupRank cr WHERE cr.State = CompanyGroupRank.State AND cr.Zone = CompanyGroupRank.Zone AND cr.combination_rank > 1 ) ORDER BY RecordNumber;
两种写法在你提供的测试数据集上运行,均会返回与期望输出完全一致的结果。
内容的提问来源于stack exchange,提问作者Chad
相关产品推荐
相关产品推荐

