如何筛选包含Type='Personal'的重复Name数据库记录?
筛选满足条件的重复记录
你的原SQL仅筛选出了Name存在重复的记录,但没有排除那些重复Name分组里完全没有Personal类型的情况(比如Hassan的两条记录)。要得到预期结果,需要同时满足两个条件:
- 同一Name存在多条记录
- 该Name的记录中至少有一条Type为
Personal
方法一:使用窗口函数
SELECT ID, Name, Type FROM ( SELECT ID, Name, Type, -- 统计每个Name的记录数 COUNT(*) OVER (PARTITION BY Name) AS cnt, -- 判断该Name分组是否存在Personal类型(存在则返回1,否则0) MAX(CASE WHEN Type = 'Personal' THEN 1 ELSE 0 END) OVER (PARTITION BY Name) AS has_personal FROM THIS_TABLE ) AS t -- 筛选重复且存在Personal的分组记录 WHERE t.cnt > 1 AND t.has_personal = 1
方法二:使用子查询关联
SELECT t.ID, t.Name, t.Type FROM THIS_TABLE t -- 先筛选出符合条件的Name:重复且至少有一条Personal JOIN ( SELECT Name FROM THIS_TABLE GROUP BY Name HAVING COUNT(*) > 1 AND SUM(CASE WHEN Type = 'Personal' THEN 1 ELSE 0 END) > 0 ) AS filtered_names ON t.Name = filtered_names.Name
这两种写法都能得到你想要的结果:只返回Jack的两条记录,排除Hassan的重复记录(因为该分组没有Personal类型),同时也不会返回Ahmed(仅单条记录)和Charlie(单条记录)的条目。
内容的提问来源于stack exchange,提问作者Shimanto Hassan
相关产品推荐
相关产品推荐

