【问题标题】:SQL How to use LAG inside SUMSQL 如何在 SUM 中使用 LAG
【发布时间】:2021-11-22 13:18:13
【问题描述】:

我的表(名称 EPM1):

TIMESTAMP INVERTER1POWER INVERTER2POWER POWERLIMIT
2021-09-30T17:19:42.309Z 100 400 0.8
2021-09-30T17:20:42.309Z 200 500 0.6
2021-09-30T17:21:42.309Z 300 600 0.7

我有一个这样的查询:

SELECT SUM(CASE WHEN (INVERTER1POWER+INVERTER2POWER) < (250000*POWERLIMIT) THEN INVERTER1POWER+INVERTER2POWER END) AS SUM1
  FROM EPM1
  WHERE TIMESTAMP >= TO_UTC_TIMESTAMP_TZ(:timefrom) AND TIMESTAMP <= TO_UTC_TIMESTAMP_TZ(:timeto)

这给了我输出:

SUM1
2100

我希望有类似的单个值,但在计算中使用上一行的POWERLIMIT - 在这部分(250000*POWERLIMIT)。因此,对于第一次迭代,它将是 (100+400)*0,因为没有先前的值。然后是(200+500)*0.8,然后是(300+600)*0.6

我尝试使用像 LAG(POWERLIMIT, 1, 0) 这样的 LAG 函数,但不能在 SUM 中使用它。

【问题讨论】:

    标签: sql oracle lag analytic-functions


    【解决方案1】:

    使用嵌套子查询:

    SELECT SUM(temp_value) AS sum2
    FROM   (
      SELECT CASE
             WHEN INVERTER1POWER+INVERTER2POWER
                  < 25000 * LAG(POWERLIMIT, 1, 0) OVER (ORDER BY timestamp)
             THEN INVERTER1POWER+INVERTER2POWER
             END AS temp_value
      FROM   epm1
    )
    

    其中,对于样本数据:

    CREATE TABLE EPM1 (TIMESTAMP, INVERTER1POWER, INVERTER2POWER, POWERLIMIT) AS
    SELECT TIMESTAMP '2021-09-30 17:19:42.309 UTC', 100, 400, 0.8 FROM DUAL UNION ALL
    SELECT TIMESTAMP '2021-09-30 17:20:42.309 UTC', 200, 500, 0.6 FROM DUAL UNION ALL
    SELECT TIMESTAMP '2021-09-30 17:21:42.309 UTC', 300, 600, 0.7 FROM DUAL
    

    输出:

    SUM2
    1600

    db小提琴here

    【讨论】:

    • 非常感谢,我花了一整天的时间来尝试这样做。刚开始玩 SQL
    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多