如何将WITHIN GROUP从Oracle转换为Postgres?

时间:2016-11-17 22:38:04

标签: sql oracle postgresql aggregate

我正在尝试将带有复杂查询的子查询从Oracle转换为Postgres。下面是子查询及其给出的错误。我知道' WITHIN GROUP' Postgres也有。我错过了什么?我甚至将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

1 个答案:

答案 0 :(得分:2)

  • 始终在Postgres中使用关键字AS作为列别名。

  • 无需双引号小写标识符。 (与Oracle不同,Postgres小写标识符除非双引号。)

  • 这也意味着,您最终会得到两个名称为a的列,因此您必须使用“A”作为第一个或其他内容 - 不确定您的列名是"A"a

  • WITHIN GROUP只能在Postgres 9.4或更高版本中用于这些Ordered-Set Aggregate Functions或这些Hypothetical-Set Aggregate Functionsstring_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 allows to add an ORDER BY clause to any aggregate function(只对某些人有意义。)

对于像这样的简单查询,您也可以:

SELECT a, string_agg(b, ', ') AS a
FROM  (SELECT a, b FROM tbl ORDER BY a,b) t
GROUP  BY a;

通常更快。 But read the manual.