Найдите пары команд, которые играли друг против друга чаще всего - PullRequest
1 голос
/ 30 апреля 2019

У меня есть следующая таблица, которая называется Involves:

match  |  team
10     |  A
10     |  B
20     |  B
20     |  C
30     |  C
30     |  A
40     |  D
40     |  C
50     |  A
50     |  B

Значения в столбце «соответствие» относятся к уникальному идентификатору совпадения, а значения в столбце «команда» относятся к уникальному идентификатору команды.

Я пытаюсь написать запрос, который выведет пару команд, которые сыграли больше всего матчей друг против друга. Вывод шоу выглядит следующим образом:

team1  |  team2  |  matches
A      |  B      |  2

Поскольку А и В играли друг против друга в двух матчах, то в матчах 10 и 50.

Чтобы решить эту проблему, я думаю, что вам нужно будет найти все возможные комбинации командных пар, а затем найти общее количество матчей, которые каждая пара сыграла друг против друга. Из этого набора результатов вы можете выбрать кортежи, которые имеют максимальное значение для общего количества сыгранных матчей. Однако я не уверен, как мне написать такой запрос, особенно в том, что касается поиска всех парных комбинаций. Любые идеи приветствуются.

Ответы [ 2 ]

5 голосов
/ 30 апреля 2019

Что-то вроде:

SELECT team1
     , team2
     , COUNT(*) AS matches_played
FROM (
    SELECT match
         , MIN(team) AS team1
         , MAX(team) AS team2
    FROM t
    GROUP BY match
) AS x
GROUP BY team1, team2
ORDER BY COUNT(*) DESC

Внутренний запрос используется для генерации упорядоченных пар, таких как (a, b), (a, c) и (b, c).

2 голосов
/ 30 апреля 2019

Объединение команд для совпадения в массив упрощает обработку результатов:

select teams[1] as team1, 
       teams[2] as team2, 
       count
from (       
  select teams, 
         count(*) as count,  
         dense_rank() over (order by count(*) desc) as rnk
  from (
    select match, array_agg(team order by team) as teams
    from matches
    group by match
  ) t1
  group by teams
) t2
where rnk = 1;

Самый внутренний запрос объединяет команды для каждого совпадения в массив, следующий уровень определяет комбинацию команд с наибольшим количеством, используя dense_rank(), а самый внешний запрос затем выбирает команды с самым высоким count отображает две команды и количество матчей.

Онлайн пример: https://rextester.com/FTOA17246

...