SQL如何实现嵌套分组并统计组内元素个数
解决方案
你需要的组内二次计数可以通过两层分组聚合实现,核心逻辑是先完成Col1、Col2维度的去重分组,再基于这个结果按Col1维度做二次统计。
可直接运行的SQL代码
SELECT Col1, COUNT(*) AS col1_group_count, GROUP_CONCAT(Col2) AS col2_values, GROUP_CONCAT(Col3) AS col3_values FROM ( -- 第一层分组:按Col1、Col2去重,基于你原有逻辑调整 SELECT Col1, Col2, GROUP_CONCAT(DISTINCT Col3) AS Col3 FROM tablename GROUP BY Col1, Col2 ) AS first_level_group GROUP BY Col1;
运行结果说明
针对你提供的测试数据:
- B组下存在
(B,R)、(B,S)两个独立的Col1+Col2分组,因此col1_group_count返回2,符合你的预期 - A、C、D、E、G组下都仅有1个Col1+Col2分组,计数返回1
注意:你插入的测试数据中F组对应
(F,U)、(F,V)两个不同的Col1+Col2组合,因此F组的计数会返回2。如果你预期F组计数为1,请核对F组对应行的Col2字段值是否正确。
逻辑解释
- 内层子查询复用了你原本写的Col1、Col2分组逻辑,仅给Col3的拼接加了
DISTINCT,避免像B组Col2=R对应的两条重复blue值被拼接成blue,blue - 外层查询对内层输出的去重一级分组结果,再按Col1做二次聚合,这时候
COUNT(*)统计的就是每个Col1下包含的独立Col1+Col2分组数量,正好匹配你要的二次分组计数需求,同时可以拼接对应Col2、Col3的取值列表。
内容的提问来源于stack exchange,提问作者lu3si
相关产品推荐
相关产品推荐

