【问题标题】:Return first element in array_agg()返回 array_agg() 中的第一个元素
【发布时间】:2015-06-23 08:06:13
【问题描述】:

我正在编写查询以获取所有球队的所有球员。我决定使用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

这个查询给我的结果如下,在结果集中 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"}

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

team_id             team_name                                                                   playerdetails
1                   Australia                       {"5##Glenn Donald McGrath","6##Shane Warne","2##Steve Waugh","1##Adam Gilchrist"}

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

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  

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   

【问题讨论】:

  • 我想你会发现这很有用:stackoverflow.com/questions/3994556/…
  • 为什么要在没有子查询的情况下这样做?
  • @Patrick 首先,这个问题是基于一些好奇心,我尝试这样做但没有取得多大成功。我认为在考虑大型数据集上的大型复杂查询时,使用子查询效率会降低跨度>

标签: sql postgresql


【解决方案1】:

这实际上是我的一个错误......我的第一个问题的答案在于该查询本身。我只需要附上(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

【讨论】:

  • 哇。谢谢你。这确实应该是公认的答案。我不能创建函数或添加库,我只需要第一个值,不用担心重复。
  • 谢谢。如果我想获取聚合数组中的最后一个元素,是否适用于使用array_agg(team_name)[-1] 或者我应该使用什么方法?我已经尝试使用 [-1] 但它没有用。
  • 如何在array_agg中按顺序添加多列
【解决方案2】:

很简单,不要聚合 team_name 而是 GROUP 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;

【讨论】:

  • 其实我没有想到,不错的建议...但事实是要加入更多的表和更多的选择列
  • 我也期待一个通用函数/实现也可以在其他查​​询中使用..
  • 以上回答了你的问题,你可以在你自己的 SQLFiddle 中查看。当然,我无法回答你没有问到的事情。因此,请编辑您的问题或发布新问题。例如,“通用功能/实现”是什么意思?
  • 抱歉给您带来了困惑...我已经更新了问题
【解决方案3】:

SELECT team_id, array_agg(distinct team_name) AS 队名, array_agg(player_id||'##'||player_name) AS playerdetails 来自团队 在 team_id = player_team 上 INNER JOIN 玩家 GROUP BY team_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2020-09-20
    • 1970-01-01
    • 2015-12-03
    相关资源
    最近更新 更多