【问题标题】:Empty GROUP BY in PostgreSQLPostgreSQL 中的空 GROUP BY
【发布时间】:2016-11-07 17:05:26
【问题描述】:

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

我的想法很简单

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

然后我意识到我在使用GROUP BY 子句时遇到了令人惊讶的困难。因为我需要对所有行进行分组,所以该子句应该留空。

GROUP BY NOTHING 最优雅的说法是什么,即对一组空的列进行分组?

【问题讨论】:

  • 只是不要使用GROUP BY
  • @Lamak Aaah,非常简单,谢谢,我以为我试过了,但显然我没有。

标签: sql postgresql group-by


【解决方案1】:

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

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

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

...
GROUP BY true

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

【讨论】:

  • GROUP BYORDER BY 子句一起使用时,GROUP BY 的缺失或常量会引发错误。
  • @jnas:没有GROUP BY 的聚合查询只返回一个行。那么为什么ORDER BY?即使由于不灵活的查询连接而发生这种情况:ORDER BY 不一定需要和明确的GROUP BY。它适用于输出列名或序号位置。只有输入列必须列在GROUP BY 中,但这会改变所述输入列中多个不同值的输出,否则只是噪音。并且ORDER BY $constant 永远不会引发错误,这是一个无操作。
【解决方案2】:

你可以使用GROUPING SETS功能see documentation

像这样:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 2019-03-10
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多