Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 子查询和聚合函数序列_Sql_Postgresql - Fatal编程技术网

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()函数。