SQL:查询按多列分组的最大不同值数
SQL: query maximum number of distinct values grouping by multiple columns
对于由三列(A、B、C)组成的 table,我想执行以下操作。对于 A 列的每个不同值,我想找到 B 的值,为此我拥有最不同的 C 值。因此,我需要先按 A 分组,然后按 B 分组,然后计算 C 的不同值这些组并找到最大值。但是,我无法找出 group by、max、count distinct 等的正确组合来实现这一点。
这在 MySQL 中是一个难题,因为它不支持 window 函数或 CTE。也许最简单的方法是使用双重聚合和字符串技巧:
select a,
substring_index(group_concat(b order by cnt desc), ',', 1) as MostCommon
from (select a, b, count(distinct c) as cnt
from t
group by a, b
) ab
group by a;
注意:对于大数据,需要关注中间字符串的长度。默认长度可扩展
另一个解决方案是使用变量:
select a, b
from (select a, b, cnt,
(@rn := if(@a = a, @rn + 1,
if(@a := a, 1, 1)
)
) rn
from (select a, b, count(distinct c) as cnt
from t
group by a, b
) ab cross join
(select @a := '', @rn := 0) params
order by a, cnt desc
) t
where rn = 1;
对于由三列(A、B、C)组成的 table,我想执行以下操作。对于 A 列的每个不同值,我想找到 B 的值,为此我拥有最不同的 C 值。因此,我需要先按 A 分组,然后按 B 分组,然后计算 C 的不同值这些组并找到最大值。但是,我无法找出 group by、max、count distinct 等的正确组合来实现这一点。
这在 MySQL 中是一个难题,因为它不支持 window 函数或 CTE。也许最简单的方法是使用双重聚合和字符串技巧:
select a,
substring_index(group_concat(b order by cnt desc), ',', 1) as MostCommon
from (select a, b, count(distinct c) as cnt
from t
group by a, b
) ab
group by a;
注意:对于大数据,需要关注中间字符串的长度。默认长度可扩展
另一个解决方案是使用变量:
select a, b
from (select a, b, cnt,
(@rn := if(@a = a, @rn + 1,
if(@a := a, 1, 1)
)
) rn
from (select a, b, count(distinct c) as cnt
from t
group by a, b
) ab cross join
(select @a := '', @rn := 0) params
order by a, cnt desc
) t
where rn = 1;