在 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
如果我有 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 |