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冗余来自何处