小编典典

是否可以通过这种方式使用AGG函数进行SQL查询?

sql

假设我具有以下聚合函数:

  • AGG1
  • AGG2
  • AGG3
  • AGG4

是否可以这样编写有效的SQL(以与数据库无关的方式):

SELECT [COL1, COL2 ....], AGG1(param1), AGG2(param2) FROM [SOME TABLES]
WHERE [SOME CRITERIA]
HAVING AGG3(param2) >-1 and AGG4(param4) < 123
GROUP BY COL1, COL2, ... COLN
ORDER BY COL1, COLN ASC
LIMIT 10

其中COL1 … COLN是要查询的表中的列,而param1 … paramX是传递给AGG函数的参数。

注意:AGG1和AGG2在结果中以列的形式返回(但不出现在HAVING CLAUSE中,而AGG3和AGG4出现在HAVING
CLAUSE中,但不在结果集中返回。

理想情况下,我希望该解决方案具有数据库不可知的答案,但是如果我必须绑定到数据库,则我使用的是PostgreSQL(v9.x)。

编辑

只需澄清一下:我不反对在查询中使用GROUP
BY。我的SQL不太好,因此上面的示例SQL可能会引起误导。我已经编辑了上面的伪sql语句,希望可以使我的意图更加清楚。

我要查找的主要内容是使用AGG函数的选择查询是否可以:

  • 在返回的列中包含agg函数值,而无需在HAVING子句中指定它们。
  • 具有在HAVING子句中指定的agg函数,但未在结果集中返回。

从到目前为止我收到的答案来看,似乎两个问题的答案都是“是”。我必须做的更正我的SQL的唯一想法是添加GROUP BY子句以确保返回的行是唯一的。


阅读 230

收藏
2021-04-14

共1个答案

小编典典

PostgreSQL的主要版本包含点号后的第一个数字,因此“
PostgreSQL(v9.x)”不够具体。正如@kekekela所说,没有(便宜的)完全db不可知论的方式。即使在PostgreSQL
9.0和9.1之间,在语法上也存在重要差异。

如果只有分组值AGG1(param1), AGG2(param2),则无需提供显式GROUP BY子句就可以摆脱。由于您混合了分组列和非分组列,
因此必须 提供一个GROUP BY子句,其中包含出现在中的所有非分组列SELECT。对于任何版本的PostgreSQL都是如此。阅读GROUP
BY并在手册中找到它

但是,从 9.1 版开始,一旦您在中列出了主键,就GROUP BY可以跳过此表的其他列,并仍在SELECT列表中使用它们。9.1版发行说明
告诉我们:

当在GROUP BY子句中指定了主键时,允许在查询目标列表中使用非GROUP BY列(Peter Eisentraut)

关于 参数

您是否打算将常量值提供给聚合函数?重点是什么?该文件告诉我们

聚合函数从多个输入行计算单个结果。

还是您希望这些参数成为列名?只要 提交数据库 之前 生成语句,就可以使用这种动态SQL
。准备语句或简单的不工作sqlplpgsql职能。为此,您必须在函数中使用EXECUTEplpgsql

作为对SQLI保障使用USING $1, $2的语法
quote_ident()为您的列或表

2021-04-14