Как получить наиболее появившуюся комбинацию с использованием SQL? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть таблица, в которой хранятся записи журнала, упрощенная версия будет

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 варианта.


основываясь на великолепном ответе Гордона Линоффа и возможностях, которые может предоставить моя платформа, я в итоге использую что-то вроде этого:

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 голосов
/ 02 мая 2018

Попробуйте

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_
0 голосов
/ 02 мая 2018

Это боль в 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;
0 голосов
/ 02 мая 2018

Я в порядке с любой комбинацией, если был галстук

Вы можете попробовать это

SELECT `key`
    ,`value`
FROM t
GROUP BY `key`
    ,`value`
ORDER BY count(*) DESC LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...