PostgreSQL中的空GROUP BY

hgqdbh6s  于 2023-01-13  发布在  PostgreSQL
关注(0)|答案(2)|浏览(126)

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

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

然后我意识到我在使用GROUP BY子句时遇到了意想不到的困难,因为我需要对所有行进行分组,所以该子句应该留空。
GROUP BY NOTHING的最佳表达方式是什么,即在空列集上执行分组?

n3ipq98p

n3ipq98p1#

要聚合 * 所有 * 行,您不需要使用GROUP BY来形成组,并且可以省略GROUP BY子句。
如果有集合函数但没有GROUP BY子句,则将查询视为具有包含所有选定行的单个组。
或者(如果动态构建查询字符串),可以使用任何常量表达式,例如:

...
GROUP BY true

不能将GROUP BY 1用于此目的,因为整数用作GROUP BY子句中SELECT列表项的位置引用(序号):

  • 是否选择每个GROUP BY组中的第一行?
yhived7q

yhived7q2#

您可以使用GROUPING SETS功能,请参阅文档
就像这样:

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

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

相关问题