Vik*_*mar 4 sql oracle postgresql aggregate
我正在尝试将带有复杂查询的子查询从 Oracle 转换为 Postgres。下面是子查询及其给出的错误。我知道 Postgres 中也有“WITHIN GROUP”。我错过了什么?我什Listagg至改为String_agg但得到同样的错误。
Select a, Listagg(b, ', ') WITHIN GROUP (ORDER BY b) "a"
from table;
错误:
错误:“WITHIN”第 65 行或附近的语法错误:...a, Listagg(b, ', ') WITHIN GRO...
********** 错误 **********
错误:“WITHIN”SQL 状态处或附近的语法错误:42601 字符:5290
始终AS在 Postgres 中为列别名使用关键字。
无需双引号小写标识符。(与 Oracle 不同,Postgres 小写标识符除非双引号。)
这也意味着,您最终会得到两个列名a,因此您必须将“A”用于第一个或其他名称 - 不确定您的列名是否为"A"或a。
WITHIN GROUP只能用于Postgres 9.4 或更高版本中的这些有序集聚合函数或这些假设集聚合函数。string_agg()目前不在其中。但是您几乎可以使用任何聚合函数作为窗口函数(Oracle 术语中的“分析函数”)。
无论哪种方式,您的查询在任一RDBMS 中似乎都无效。您有一个聚合函数和一个未聚合的列,但没有GROUP BY子句。要么您希望它是一个窗口函数(Oracle 中的分析函数),则OVER缺少该子句。或者您需要GROUP BY a为聚合函数添加。
我想你想要这样的东西:
SELECT a, string_agg(b, ', ' ORDER BY b) AS a2  -- column names?
FROM   tbl
GROUP  BY a;
Postgres 允许添加ORDER BY到任何聚合函数。(只对某些人有意义。)
对于像这样的简单查询,您也可以在子查询中进行排序:
SELECT a, string_agg(b, ', ') AS a
FROM  (SELECT a, b FROM tbl ORDER BY a,b) t
GROUP  BY a;
这通常更快。但请阅读此处的手册。