查找对战次数最多的球队

时间:2019-04-30 08:50:18

标签: sql postgresql aggregate-functions

我有一张名为Involves的表格:

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

“比赛”列中的值是比赛的唯一ID,而“团队”列中的值是团队的唯一ID。

我正在尝试编写一个查询,该查询将输出对战次数最多的球队。 输出显示如下:

team1  |  team2  |  matches
A      |  B      |  2

由于A和B在两场比赛中互相对战,比赛10和50。

要解决此问题,我认为您必须找到所有可能的球队对组合,然后找出每对之间进行的比赛总数。从该结果集中,您可以选择具有所有已进行比赛总数最大值的元组。但是,我不确定如何编写这样的查询,特别是在查找所有配对组合方面。任何见解都会受到赞赏。

2 个答案:

答案 0 :(得分:5)

类似的东西:

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)

答案 1 :(得分:2)

将一场比赛的球队汇总到一个数组中,可以更加轻松地处理结果:

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