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