找到交手次数最多的球队对

Posted

技术标签:

【中文标题】找到交手次数最多的球队对【英文标题】:Find pairs of teams that played against each other most number of times 【发布时间】:2019-04-30 08:50:18 【问题描述】:

我有一个名为 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 场比赛。

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

【问题讨论】:

【参考方案1】:

类似:

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)

【讨论】:

match 不是关键字吗? 引用它。我对 pgsql 不熟悉。 @cid:这是一个关键字,但不是保留的。所以你可以不用引用就可以使用它。【参考方案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

【讨论】:

我认为使用dense_rank() 更适合该问题,因为该问题表明多对可能满足条件。

以上是关于找到交手次数最多的球队对的主要内容,如果未能解决你的问题,请参考以下文章

只用2GB内存在20亿个整数中找到出现次数最多的数

从数组中找到元素出现次数最多的元素

如何获取数组中出现次数最多的字符串?

如何求出数组中出现次数最多的数字(C#实现)

如何在 Redshift 中找到访问次数最多的表?

找到《飘》中次数最多的N个单词