在PostgreSQL中清空GROUP BY

时间:2016-11-07 17:05:27

标签: sql postgresql group-by

我有一张关联规则表(比如先行者,后续者和支持者)。我想在GraphViz中绘制它们。我变得如此懒惰以至于我不想为此编写任何命令式脚本,我只想直接在SQL中选择DOT源。

我的想法就像

一样简单
SELECT string_agg('"' || x || '" -> "' || y || '" [weight="' || weight || '"]', E'\n')
FROM rules
GROUP BY ...;

然后我意识到我对GROUP BY条款有惊人的困难。因为我需要对所有行进行分组,所以该子句应该留空。

GROUP BY NOTHING的最优雅方式是什么,即在一组空列上执行分组?

2 个答案:

答案 0 :(得分:1)

要聚合所有行,您不需要使用GROUP BY形成组,并且可以省略GROUP BY子句。 The manual:

  

如果存在聚合函数但没有GROUP BY子句,则查询为   被视为具有包含所有选定行的单个组。

或者(如果要动态构建查询字符串),可以使用任何常量表达式,如:

...
GROUP BY true

您不能将 GROUP BY 1 用于此目的,因为整数常量在GROUP BY中用作位置引用(序号):

答案 1 :(得分:1)

您可以使用GROUPING SETS功能see documentation

像这样:

...
GROUP BY GROUPING SETS ((<your comma-separated list of columns>))

因此,如果您的列列表为空,则最终看起来像 GROUP BY GROUPING SETS (()) 恰好是有效语法,其行为与根本没有 GROUP BY 相同