Oracle 到 Postgres SQL 语法转换

标签 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 并使用 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/

相关文章:

sql - 为什么no_data_found ORA-01403是Oracle中的异常?

sql - 如何在 PostgreSQL 中获取每条具有特定属性集的记录之后的第一条记录?

java - 使用 Eclipse JDBC 将 Postgres 查询计划转换为 xml 并存储在文件中

java - 在select sql语句中将参数设置为null

postgresql - 如何创建一系列值,然后使用它们将数据插入 postgresql 数据库

sql - postgres 列 "X"不存在

sql - Postgres 触发器创建 - 错误 : no language specified SQL state: 42P13

sql - Oracle SQL View : Multiple rows to one with help of foreign key

oracle - OCI & 即时客户端 SDK & Oracle 数据库

sql - 使用 nvl 和 max 查找唯一值