【问题标题】:Update previous days count using LAG function in ORACLE使用 ORACLE 中的 LAG 函数更新前几天计数
【发布时间】:2019-08-27 00:06:33
【问题描述】:

我有一个表,其中列产品、txn_date 和 no_of_txns。最近添加了一列 prev_day_txn 到该列。数据如下:

Product   TXN_DATE  NO_OF_TXNS 

AA         1-JAN-19      100
AA         2-JAN-19      180
AA         3-JAN-19      290

添加新列后,该列中的数据应填充前一天的数据。输出应如下所示:

Product       TXN_DATE     NO_OF_TXNS  PREV_DAY_TXN

    AA         1-JAN-19      100          0
    AA         2-JAN-19      180         100
    AA         3-JAN-19      290         180

我正在尝试使用 lag 函数更新数据,但出现错误 SQL Error: ORA-30483: window functions are not allowed hereSame 查询在 select 子句中工作正常。这是我尝试过的:

update PRD_DTLS set PREV_DAY_TXN = LAG(NO_OF_TXNS, 1, 0) OVER (ORDER BY PRODUCT, TXN_DATE);

谁能帮我查询。谢谢。

【问题讨论】:

  • 真是个坏主意!为什么要将值存储在新列中,可以从其他列动态计算?相反,如果您经常需要参考前一天的数据,您应该在 视图 中执行此操作,并在需要时从视图而不是表格中进行选择。如果“性能”是您的理由,请改用物化视图。想一想:你能用锤子打鸡蛋吗?当然可以。你应该? ........

标签: sql oracle lag


【解决方案1】:

您可以使用 MERGE:

MERGE INTO PRD_DTLS A USING 
(
  SELECT
      PRODUCT,
      TXN_DATE,
      LAG(NO_OF_TXNS) OVER(
          PARTITION BY PRODUCT
          ORDER BY
              TXN_DATE
      ) AS PREV_TXN
  FROM
      PRD_DTLS 
)
B ON ( A.PRODUCT = B.PRODUCT
       AND A.TXN_DATE = B.TXN_DATE )
WHEN MATCHED THEN UPDATE SET A.PREV_DAY_TXN = CASE
    WHEN B.PREV_TXN IS NOT NULL THEN B.PREV_TXN
    ELSE 0
END;

干杯!!

【讨论】:

    【解决方案2】:

    一种方法使用子查询:

    UPDATE PRD_DTLS pd
        SET PREV_DAY_TXN = (SELECT COALESCE(MAX(NO_OF_TXNS) KEEP (DENSE_RANK FIRST ORDER BY TXN_DATE DESC), 0)
                            FROM PRD_DTLS pd2
                            WHERE pd2.PRODUCT = pd.PRODUCT AND
                                  pd2.TXN_DATE < pd.TXN_DATE
                           );
    

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多