gpt4 book ai didi

sql - 不限制行的Postgresql GROUP BY

转载 作者:行者123 更新时间:2023-11-29 13:04:53 25 4
gpt4 key购买 nike

我在 Postgres 中运行以下 SQL 查询:

SELECT a.id, a.name, array_to_string(array_agg(c.name), ',') AS tags_string, 
CASE d.is_reminder WHEN 't' then 'overdue' ELSE '' END AS overdue
FROM contacts AS a
LEFT OUTER JOIN taggings b ON b.contact_id=a.id
LEFT OUTER JOIN tags c ON b.tag_id=c.id
LEFT OUTER JOIN tasks d ON a.id=d.contact_id
GROUP BY a.id, d.is_reminder
ORDER BY a.id;

它从我的数据库返回以下记录:

  id   |        name        |         tags_string          | overdue 
-------+--------------------+------------------------------+---------
24471 | Austin Wang | |
24472 | Chris Rothstein | Seller | overdue
24473 | Josh Hohman | Seller | overdue
24474 | Jay Pritchett | Friends & Family |
24475 | Claire Dunphy | Past Client,Friends & Family |
24475 | Claire Dunphy | Past Client,Friends & Family | overdue
24476 | Haley Dunphy | Buyer | overdue
24477 | Cameron Tucker | Friends & Family | overdue
24478 | Gloria Pritchett | Friends & Family | overdue
24479 | Mitchell Pritchett | Buyer | overdue

我只想为每个 ID 返回 1 行。在上面的结果中,Claire Dunphy id:24475 出现了两次:一次带有“过期”,一次没有。如果一个 id 有一个“过期”,那么我希望这个记录出现。

如果联系人没有过期任务,那我还是要显示记录。我只想消除为也有过期任务的联系人显示未过期任务(如果有的话)。

在上面的结果中,这意味着我将显示第二个 Claire Dunphy 记录,而不是第一个。

非常感谢任何帮助!

最佳答案

尝试

SELECT a.id, 
a.name,
array_to_string(array_agg(c.name), ',') tags_string,
CASE WHEN strpos(array_to_string(array_agg(d.is_reminder), ','), 't') > 0 THEN 'overdue' ELSE '' END overdue
FROM contacts a LEFT JOIN taggings b
ON b.contact_id = a.id LEFT JOIN tags c
ON b.tag_id = c.id LEFT JOIN tasks d
ON a.id = d.contact_id
GROUP BY a.id

这是 SQLFiddle 展示想法的演示。

它显然基于您发布的预聚合示例数据,但仍然展示了如何检测聚合列是否存在过期行。

关于sql - 不限制行的Postgresql GROUP BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16908338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com