【问题标题】:Oracle to Postgres SQL syntax conversionOracle 到 Postgres SQL 语法转换
【发布时间】:2018-04-24 01:33:39
【问题描述】:

我正在处理从 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')。

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

提前致谢。

【问题讨论】:

  • 我删除了多余的mysql 标签。 Stack Overflow 有一个问题,他们建议 mysql 解决任何与 SQL 相关的问题。
  • 请您提供一些示例数据和预期输出。

标签: oracle postgresql


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2015-03-19
    • 2023-01-18
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多