Mysql 如何使用SQL获取最常见的组合?

Mysql 如何使用SQL获取最常见的组合?,mysql,sql,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-1和a-3组合只出现一次,而a-2组合出现两次 欢迎任何类型的SQL解决方案,我只想知道解决这个问题的要点,我会为我自己的平台/SQL变体找到合适的解决方案 基于Gordon Linoff的精彩回答和我的平台所能提供的功能,我最终使用了以下内容: selec

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

key value
a   1
a   2
a   3
a   2
b   1
b   2
b   2
我只想提取最常见的组合,如:

key  value
a    2
b    2
因为
a-1
a-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
如果打成平局,两种组合我都可以

你可以试试这个

SELECT `key`
    ,`value`
FROM t
GROUP BY `key`
    ,`value`
ORDER BY count(*) DESC LIMIT 1
如果打成平局,两种组合我都可以

你可以试试这个

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

DECLARE @T TABLE  (key_ varchar(10),Val int)
INSERT INTO @T
SELECT 'a' Key_, 1 Val UNION ALL
SELECT 'a' k, 2 v UNION ALL
SELECT 'a' k, 3 v UNION ALL
SELECT 'a' k, 2 v UNION ALL
SELECT 'b' k, 1 v UNION ALL
SELECT 'b' k, 2 v UNION ALL
SELECT 'b' k, 2 v

SELECT T.key_,T.Val FROM (SELECT key_,Val,Row_Number()Over(Partition By Key_,Val Order By key_ ) Count_ FROM @T) T INNER JOIN 
(SELECT MAX(Count_) Count_ FROM (SELECT Row_Number()Over(Partition By Key_,Val Order By key_ ) Count_ FROM @T)X) XX ON XX.Count_ = T.Count_
试试这个

DECLARE @T TABLE  (key_ varchar(10),Val int)
INSERT INTO @T
SELECT 'a' Key_, 1 Val UNION ALL
SELECT 'a' k, 2 v UNION ALL
SELECT 'a' k, 3 v UNION ALL
SELECT 'a' k, 2 v UNION ALL
SELECT 'b' k, 1 v UNION ALL
SELECT 'b' k, 2 v UNION ALL
SELECT 'b' k, 2 v

SELECT T.key_,T.Val FROM (SELECT key_,Val,Row_Number()Over(Partition By Key_,Val Order By key_ ) Count_ FROM @T) T INNER JOIN 
(SELECT MAX(Count_) Count_ FROM (SELECT Row_Number()Over(Partition By Key_,Val Order By key_ ) Count_ FROM @T)X) XX ON XX.Count_ = T.Count_

这在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;

这在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;

只是想知道如果两人之间有平局你会怎么做combinations@nicholasnet谢谢你的提醒,我同意任何一种组合如果有平局你的初选是什么KEY@Strawberry因为它是一个原始日志表,根本没有主键,只是想知道如果两者之间有联系,你会怎么做combinations@nicholasnet谢谢你的提醒,我同意任何一种组合如果有平局你的初选是什么KEY@Strawberry由于它是一个原始日志表,因此没有确切的主键感谢您的解决方案,但是你的答案只给了我一个组合,也就是说,在这种情况下,我会失去
b-2
组合谢谢你的解决方案,但你的答案只给了我一个组合,也就是说,我会失去
b-2
组合在这种情况下,你的解决方案真是太棒了!遗憾的是,我的平台似乎既不支持带子查询的
也不支持窗口函数内的
聚合函数
,我可能遗漏了什么,我将继续调查。不管怎样,你的解决方案真的激励了我,非常感谢!我最终使用了类似但更详细的版本,请参阅我的updates@jasonslyvia . . . (1) 如果可以在同一个查询中包含窗口函数和聚合函数,则无需嵌套子查询(但我理解为什么会这样做)。(2)
rank()
是这个查询中
max()
的一个非常合理的替代方案。感谢您的友好反馈,现在我意识到我的SQL冗余来自何处您的解决方案真是太棒了!遗憾的是,我的平台似乎既不支持带子查询的
也不支持窗口函数内的
聚合函数
,我可能遗漏了什么,我将继续调查。不管怎样,你的解决方案真的激励了我,非常感谢!我最终使用了类似但更详细的版本,请参阅我的updates@jasonslyvia . . . (1) 如果可以在同一个查询中包含窗口函数和聚合函数,则无需嵌套子查询(但我理解为什么会这样做)。(2)
rank()
是这个查询中
max()
的一个非常合理的替代方案。感谢您的友好反馈,现在我意识到我的SQL冗余来自何处