返回array_agg()中的第一个元素

Nan*_*r V 7 sql postgresql

我正在写一个查询,以获得所有球队的所有球员.我没有在应用程序中循环,而是决定使用单个查询来获取所有团队的玩家array_agg().我写的查询如下:

SELECT team_id, array_agg(team_name) AS teamname,
       array_agg(player_id||'##'||player_name) AS playerdetails
FROM team
INNER JOIN players ON team_id = player_team
GROUP BY team_id
Run Code Online (Sandbox Code Playgroud)

这个查询给我的结果如下,在结果集中teamname重复(确切地说是玩家的数量)

team_id             team_name                                                                   playerdetails
1       {Australia,Australia,Australia,Australia}                       {"5##Glenn Donald McGrath","6##Shane Warne","2##Steve Waugh","1##Adam Gilchrist"}
2       {India,India,India,India}                                       {"8##Kapil Dev","11##Saurav Ganguly","3##Rahul Dravid","9##Sachin Tendulkar"}
3       {"South Africa","South Africa","South Africa","South Africa"}   {"12##Gary Kristen","4##Shaun Pollock","7##Jacques Kallis","10##Alan Donald"}
Run Code Online (Sandbox Code Playgroud)

有没有办法像这样返回结果

team_id             team_name                                                                   playerdetails
1                   Australia                       {"5##Glenn Donald McGrath","6##Shane Warne","2##Steve Waugh","1##Adam Gilchrist"}
Run Code Online (Sandbox Code Playgroud)

我使用子查询实现了它,但想知道是否可以在没有子查询的情况下编写它

SELECT team_id, teamname[1], playerdetails
FROM (
  SELECT team_id, array_agg(team_name) AS teamname,
         array_agg(player_id||'##'||player_name) AS playerdetails
  FROM team
  INNER JOIN players ON team_id = player_team
  GROUP BY team_id) AS tempresult  
Run Code Online (Sandbox Code Playgroud)

sqfiddle在这里.我正在使用Postgresql 8.4

[编辑]当
我尝试检索未在group by中指定的列时, 我实际上正在考虑破解GROUP BY限制column "team.team_status" must appear in the GROUP BY clause or be used in an aggregate function

SELECT team_id, array_agg(team_name) AS teamname,
       array_agg(player_id||'##'||player_name) AS playerdetails,
       team_status -- could be replaced by something like array_agg(team_status)[0] or customfunction(team_status)
FROM team
INNER JOIN players ON team_id = player_team
GROUP BY team_id   
Run Code Online (Sandbox Code Playgroud)

Nan*_*r V 11

对我而言,这实际上是一个错误...第一个问题的答案在于该查询本身。我只需要封闭(array_agg(team_name))[1],早些时候我没有括号就尝试了。

SELECT team_id, (array_agg(team_name))[1] AS teamname,
     array_agg(player_id||'##'||player_name) AS playerdetails
FROM team
INNER JOIN players ON team_id = player_team
GROUP BY team_id
Run Code Online (Sandbox Code Playgroud)


Pat*_*ick 5

很简单,不要聚合,team_nameGROUP BY它:

SELECT team_id, team_name, array_agg(player_id||'##'||player_name) AS playerdetails
FROM team
JOIN players ON team_id = player_team
GROUP BY team_id, team_name;
Run Code Online (Sandbox Code Playgroud)

  • 上面完全回答了你的问题,你可以检查你自己的SQLFiddle。当然,你没有问过的事情我无法回答。因此,请编辑您的问题或发布新问题。例如,“通用函数/实现”是什么意思? (2认同)