2

对于由三列(A、B、C)组成的表,我想做以下事情。对于 A 列的每个不同值,我想找到 B 的值,其中我有 C 的最不同值。所以,我需要先按 A 分组,然后按 B 分组,然后计算 C 的不同值这些组并找到最大值。但是,我无法弄清楚 group by、max、count distinct 等的正确组合来实现这一点。

4

1 回答 1

4

这在 MySQL 中很痛苦,因为它不支持窗口函数或 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;
于 2015-11-14T19:00:45.917 回答