gpt4 book ai didi

sql - 如何将 WITHIN GROUP 从 Oracle 翻译成 Postgres?

转载 作者:行者123 更新时间:2023-11-29 12:10:08 24 4
gpt4 key购买 nike

我正在尝试将具有复杂查询的子查询从 Oracle 转换为 Postgres。下面是子查询及其给出的错误。我知道 Postgres 中也有“WITHIN GROUP”。我错过了什么?我什至将 Listagg 更改为 String_agg 但得到了同样的错误。

Select a, Listagg(b, ', ') WITHIN GROUP (ORDER BY b) "a"
from table;

错误:

ERROR: syntax error at or near "WITHIN" LINE 65: ...a, Listagg(b, ', ') WITHIN GRO...

********** Error **********

ERROR: syntax error at or near "WITHIN" SQL state: 42601 Character: 5290

最佳答案

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

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

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

  • WITHIN GROUP 只能用于这些 Ordered-Set Aggregate Functions或者这些 Hypothetical-Set Aggregate Functions在 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 allows to add ORDER BY 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 here.

关于sql - 如何将 WITHIN GROUP 从 Oracle 翻译成 Postgres?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40666324/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com