如何查找在GroupBy所有分组中均存在的数据行
找出存在于所有Personnel分组中的TaskId
这事儿好办!咱们要找的是在所有不同人员分组里都出现过的TaskId,核心思路就是统计每个TaskId覆盖了多少个唯一的PersonnelId,再和总共有多少个唯一的PersonnelId做对比——相等的就是目标TaskId。
这里有两种常用的实现方式:
方法一:使用变量存储总人员数
先获取临时表里一共有多少个不同的PersonnelId,再筛选出覆盖全部人员的TaskId:
-- 先计算总共有多少个唯一的PersonnelId DECLARE @TotalUniquePersonnel INT SELECT @TotalUniquePersonnel = COUNT(DISTINCT PersonnelId) FROM #People -- 筛选出覆盖所有人员的TaskId SELECT TaskId FROM #People GROUP BY TaskId HAVING COUNT(DISTINCT PersonnelId) = @TotalUniquePersonnel
方法二:子查询直接对比
不用额外变量,直接在HAVING子句里嵌套子查询计算总人员数:
SELECT TaskId FROM #People GROUP BY TaskId HAVING COUNT(DISTINCT PersonnelId) = (SELECT COUNT(DISTINCT PersonnelId) FROM #People)
代码解释
GROUP BY TaskId:把相同TaskId的记录归为一组COUNT(DISTINCT PersonnelId):统计每个TaskId关联了多少个不同的人员(避免同一个人员多次关联同一个TaskId的干扰)- 最后用HAVING子句对比这个统计数和总人员数,相等就说明该TaskId在所有人员分组里都存在
用你给出的测试数据跑这段代码,结果正好会返回42,完全符合需求~
内容的提问来源于stack exchange,提问作者Bohn
相关产品推荐
相关产品推荐

