如何使用SQL获得最多出现的组合?

时间:2018-05-02 02:37:29

标签: mysql sql

我有一个存储日志条目的表,简化版本将是

key value
a   1
a   2
a   3
a   2
b   1
b   2
b   2

我想提取出现最多的组合,如:

key  value
a    2
b    2

由于a-1a-3组合只出现一次,a-2组合只有两次。

欢迎使用任何类型的SQL解决方案,我只是想知道解决这个问题的要点,我会为自己的平台/ sql变体找到合适的解决方案。

基于Gordon Linoff的出色答案以及我的平台可以提供的能力,我最终使用了这样的东西:

select 
  key,
  value
from (
  select
    key,
    value,
    rank() over(partition by key order by t1.cnt desc) as rank
  from (
    select
      key,
      value,
      count(*) as cnt
    from 
      table
    group by
      key,
      value
  ) t1
  group by
    key,
    value,
    t1.cnt
) t2
where t2.rank = 1

3 个答案:

答案 0 :(得分:1)

  

如果有平局,我可以使用任何一种组合

你可以试试这个

SELECT `key`
    ,`value`
FROM t
GROUP BY `key`
    ,`value`
ORDER BY count(*) DESC LIMIT 1

答案 1 :(得分:1)

这是MySQL的痛苦,但你可以这样做:

select key, value, count(*) as cnt
from t
group by key, value
having cnt = (select count(*)
              from t
              group by key, value
              order by count(*) desc
              limit 1
             );

如果您使用的是MySQL版本8或任何其他数据库,请使用rank()或窗口函数:

select key, value, cnt
from (select key, value, count(*) as cnt,
             max(count(*)) over () as max_cnt
      from t
      group by key, value
     ) t
where cnt = max_cnt;

答案 2 :(得分:0)

试试这个

{{1}}