Oracle to Postgres SQL语法转换

时间:2017-11-10 18:44:27

标签: oracle postgresql

我正在使用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')完成。

如果有人对此有任何见解,请告诉我。

提前致谢。

1 个答案:

答案 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语法,你必须以某种方式模拟这个函数,上面就是这样的模拟。