如何使用sql获得最佳组合?

5m1hhzi4  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(245)

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

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
1l5u6lss

1l5u6lss1#

试试这个

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_
ou6hu8tu

ou6hu8tu2#

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

jvlzgdj93#

如果打成平手,两种组合我都可以
你可以试试这个

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

相关问题