SQL按条件查找重复行:ProductNumber重复且含1和5类型
问题分析与解决
原代码存在的问题
你写的CTE里,COUNT(ProductType) OVER(PARTITION BY ProductNumber)仅统计每个ProductNumber对应的总行数,只要行数大于1就会被筛选,但完全没校验这些行是否同时包含ProductType=1和ProductType=5两种类型。这就是A-000086(两行都是类型5)被错误纳入结果的原因。
正确实现方法
方法一:先筛选合规ProductNumber,再关联原表
先通过分组筛选出同时存在类型1和5的ProductNumber,再用这些编号匹配原表的所有对应记录:
-- 获取符合条件的ProductNumber WITH ValidProductNumbers AS ( SELECT ProductNumber FROM #Product WHERE ProductType IN (1,5) GROUP BY ProductNumber -- 确保同时包含1和5两种类型 HAVING COUNT(DISTINCT ProductType) = 2 ) -- 关联原表取出所有对应记录 SELECT p.* FROM #Product p JOIN ValidProductNumbers v ON p.ProductNumber = v.ProductNumber
方法二:使用EXISTS子查询
通过两次EXISTS检查,确保当前行的ProductNumber既存在类型1的记录,也存在类型5的记录:
SELECT * FROM #Product p WHERE EXISTS (SELECT 1 FROM #Product WHERE ProductNumber = p.ProductNumber AND ProductType = 1) AND EXISTS (SELECT 1 FROM #Product WHERE ProductNumber = p.ProductNumber AND ProductType = 5)
方法三:窗口函数实现
用窗口函数统计每个编号下符合要求的不同类型数量,再筛选数量等于2的记录:
WITH CTE AS ( SELECT ProductNumber , ProductType , ProductName , COUNT(DISTINCT CASE WHEN ProductType IN (1,5) THEN ProductType END) OVER(PARTITION BY ProductNumber) AS ValidTypeCount FROM #Product ) SELECT ProductNumber, ProductType, ProductName FROM CTE WHERE ValidTypeCount = 2
以上三种方法都能得到预期结果:仅保留A-000217和A-001146的所有记录,排除不符合条件的A-000086和A-001229。
内容的提问来源于stack exchange,提问作者bryannsi
相关产品推荐
相关产品推荐

