Sql 子查询和聚合函数序列
我有两张桌子:球队和球员。球员们以团队形式比赛 小组:Sql 子查询和聚合函数序列,sql,postgresql,Sql,Postgresql,我有两张桌子:球队和球员。球员们以团队形式比赛 小组: team_id team_name region 1 Spain Asia 玩家: team_id player_id age 1 1 27 我需要弄清楚哪个地区是最年轻的球队。因此,我需要逐步找出每个团队的平均年龄,然后找出这些值中的最小值,然后选择具有该最小值的区域 我写了一个查询,只有当计算出的最小平均值是唯一的时,它才起作用: select teams.id, re
team_id team_name region
1 Spain Asia
玩家:
team_id player_id age
1 1 27
我需要弄清楚哪个地区是最年轻的球队。因此,我需要逐步找出每个团队的平均年龄,然后找出这些值中的最小值,然后选择具有该最小值的区域
我写了一个查询,只有当计算出的最小平均值是唯一的时,它才起作用:
select teams.id, region, avg(age) as average from teams
inner join players_stat on teams.id=players_stat.id
group by teams.id, region
order by average asc
limit 1
但是,如果我对来自不同地区的多个团队具有相同的最低年龄,我不知道如何编写简明的查询。我尝试使用最多3个子查询,但没有找到有效的方法。最令人沮丧的是,下面的代码给出了我想要的最低年龄
select min(a.average) from
(select teams.id, region, avg(age) as average from teams
inner join players_stat on teams.id=players_stat.id
group by teams.id, region
order by average asc) a
但我无法获得地区信息。如果我在select后面包含'region',则需要将其包含在'groupby'子句中。如果我这样做,它会按区域计算最小值
请帮助您的第一个查询似乎没有问题。我将使用表别名编写它:
select t.id, t.region, avg(ps.age) as average
from teams t join
players_stat ps
on t.id = ps.id
group by t.id, t.region
order by average asc
limit 1
在计算最小
avg(age)
之前,不要包含区域信息。若要在平局时维护所有团队,请使用rank()
函数
with team_avg as (
select team_id, avg(age) as avg_age,
rank() over (order by avg(age)) as team_rank
from players
group by team_id
)
select t.*, a.avg_age
from teams t
join team_avg a
on a.team_id = t.team_id
where a.team_rank = 1;
谢谢,但如果我有两支来自不同地区的球队,平均年龄为“32岁”,那该怎么办呢?例如,我不能设置“限制1”谢谢!我应该看看这个rank()函数。