我正在处理 Oracle 到 Postgres 的转换,我被一段代码困住了,这让我抓狂。我不确定如何在 Postgres 中使用 SUM(VALUE) KEEP (DENSE_RANK FIRST ORDER BY START_DATE DESC) AS LATEST_VALUE
。
我提到了 this page那对我不起作用。因为在我的例子中,查询具有 GROUP BY
条件,在这种情况下似乎非常困难。
这是为 Oracle 编写的一段代码,在转换为 Postgres 时遇到了困难。
SELECT
R_ID,
S_TYPE,
I_ID,
M_TYPE,
TRUNC(CAST( START_DATE, 'D') AS START_DATE,
SUM(VALUE) AS SUM_VALUE,
SUM(VALUE) KEEP (DENSE_RANK FIRST ORDER BY START_DATE DESC) AS LATEST_VALUE
FROM
TABLEX
WHERE
ACTIVE = 'Y'
GROUP BY
R_ID,
S_TYPE,
I_ID,
M_TYPE,
TRUNC( START_DATE, 'D')
最重要的是让 DENSE_RANK 用于 START_DATE 并使用 TRUNC(START_DATE, 'D') 完成 GROUP BY。
如果有人对此有任何见解,请告诉我。
提前致谢。
最佳答案
尝试:
SELECT
R_ID,
S_TYPE,
I_ID,
M_TYPE,
TRUNC(CAST( START_DATE, 'D') AS START_DATE,
SUM(VALUE) AS SUM_VALUE,
SUM(CASE START_DATE WHEN my_date THEN VALUE ELSE 0 END) AS LATEST_VALUE
FROM (
SELECT *,
max( START_DATE ) OVER (partition by R_ID,
S_TYPE,
I_ID,
M_TYPE,
TRUNC( START_DATE, 'D')
) As my_date
FROM TABLEX
WHERE
ACTIVE = 'Y'
) x
GROUP BY
R_ID,
S_TYPE,
I_ID,
M_TYPE,
TRUNC( START_DATE, 'D')
无论是 PostgreSQL 还是我所知道的任何其他 RDBMS 都不支持 Oracle 的 KEEP DENSE RANK 语法,您必须以某种方式模拟此功能,以上就是这样的模拟。
关于Oracle 到 Postgres SQL 语法转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47229257/