在 Having 子句中使用 2 聚合

Using 2 Aggregation in Having Clause

如果我有 table 包含来自多个联赛的所有球队的数据,我如何才能获得每个联赛的第一支球队?每个联赛中的第一支球队应该是得分最多的球队,或者如果得分相等则净胜球最好的球队 (GF-GA)

例如:

League Team GF GA Points
Champion Group A Bayren 18 5 16
Champion Group A Atlteico Madrid 7 8 9
Champion Group H PSG 13 6 12
Champion Group H RB Leipzig 11 12 12

我想得到这样的结果:

League Team
Champion Group A Bayren
Champion Group H PSG
SELECT TEAM, LEAGUE
FROM LEAGUES_TABLE
GROUP BY LEAGUE
HAVING MAX(POINTS)  //or if point equal use MAX(GF-GA)

试试这个。我没有对此进行测试,但在我看来,这应该可行。

with team_points_ranked as (SELECT TEAM, LEAGUE, GA, GF
FROM LEAGUES_TABLE
GROUP BY LEAGUE
HAVING MAX(POINTS))

select TEAM, LEAGUE
from team_points_ranked
group by LEAGUE
having MAX(GF-GA)

您可以使用 ROW_NUMBER() window 函数:

SELECT league, team, gf, ga, points
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY league ORDER BY points DESC, gf - ga DESC) rn
  FROM leagues_table
)
WHERE rn = 1

NOT EXISTS:

SELECT lt1.* FROM leagues_table lt1
WHERE NOT EXISTS (
  SELECT 1 FROM leagues_table lt2
  WHERE lt2.league = lt1.league 
    AND (lt2.points > lt1.points 
         OR (lt2.points = lt1.points AND lt2.gf - lt2.ga > lt1.gf - lt1.ga)
        ) 
)

或使用相关子查询:

SELECT lt1.* FROM leagues_table lt1
WHERE lt1.rowid = (
  SELECT lt2.rowid
  FROM leagues_table lt2
  WHERE lt2.league = lt1.league
  ORDER BY lt2.points DESC, lt2.gf - lt2.ga DESC
)

参见demo
结果:

League Team GF GA Points
Champion Group A Bayren 18 5 16
Champion Group H PSG 13 6 12