找到交手次数最多的球队对
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()
更适合该问题,因为该问题表明多对可能满足条件。以上是关于找到交手次数最多的球队对的主要内容,如果未能解决你的问题,请参考以下文章