【发布时间】:2013-04-07 17:56:57
【问题描述】:
当查询中有许多其他列时,是否有适当的方法来聚合单个列?
我试过this answer 可行,但我的查询变得更加冗长。
我当前的查询如下所示:
SELECT t1.foo1, t1.foo2, t2.foo3, t2.foo4, string_agg(t3.aggregated_field, ', ')
FROM tbl1 t1
LEFT JOIN tbl2 t2 ON t1.id = t2.fkeyid
LEFT JOIN tbl3 t3 ON t2.id = t3.fkeyid
GROUP BY t1.foo1, t1.foo2, t2.foo3, t2.foo4, t2.foo5, t2.foo6
ORDER BY t2.foo5, t2.foo6
查询有更多的字段和LEFT JOINs,重要的是所有这些字段都有1对1或1对0的关系,除了我要聚合的一个1对n的字段,用@987654324表示@ 在上面的伪查询中。
当我使用聚合函数时,SELECT 和 ORDER BY 中列出的所有字段必须是聚合的,或者是 GROUP BY 子句的一部分。这使我的查询方式比现在更详细。
即假设foo1是一个主键,当这个字段重复时,除了aggregated_field之外的所有其他字段也是相等的。我希望这些重复的行作为带有聚合字段值的单行结果。 (基本上是一个带有聚合列的select distinct)
有没有更好的方法来做到这一点(不必将所有其他字段放在GROUP BY 中)或者我应该只在我的后端迭代结果集,为获取这个 1 到 n 的每一行执行一个查询关系?
服务器运行的是 PostgreSQL 9.1.9,更具体地说:
x86_64-unknown-linux-gnu 上的 PostgreSQL 9.1.9,由 gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54) 编译,64 位
【问题讨论】:
-
为什么开发人员不披露他所询问的软件版本。为什么?在 SO 上,这是一个痛苦的群众现象。这就像原本非常聪明的人一旦提出问题就会立即变成傻瓜。提供您的软件版本和您的问题。 这应该不言而喻。
-
@ErwinBrandstetter 我的错,版本是 9.0+,我将连接到服务器的网络,以便在添加问题之前检查确切的版本。
-
@ErwinBrandstetter 已更新。
-
谢谢。我的评论是不断积累的挫败感的结果。应该是那么明显。然而,很多人都没有想到。甚至是名声大噪的人。顺便说一句,9.1 - 你在那里很幸运。我的回答应该对你有用。
-
@ErwinBrandstetter 是的,我明白了。尽管
string_agg的使用隐含地使它成为pgsql9+,但我应该比小版本有重大变化更清楚,而且我承认我不事先检查版本是我的懒惰。浏览答案非常有意义,当我有时间应用和测试它时,我会在一小时左右提供反馈。=]
标签: sql postgresql aggregate-functions