我正在使用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,GROUP BY用TRUNC(START_DATE,'D')完成。
如果有人对此有任何见解,请告诉我。
提前致谢。
答案 0 :(得分:1)
尝试:
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语法,你必须以某种方式模拟这个函数,上面就是这样的模拟。