假设我有以下聚合函数:
- AGG1
- AGG2
- AGG3
- AGG4
是否可以像这样编写有效的 SQL(以与 db 无关的方式):
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 子句以确保返回的行是唯一的。