【问题标题】:Using LAG() on an UPDATE with CASE statements在带有 CASE 语句的 UPDATE 上使用 LAG()
【发布时间】:2021-04-27 19:50:26
【问题描述】:

我在 Python 仪表板上有一个查询(使用 Plotly/Dash),它允许用户设置一些变量并更新 BigQuery 中的表。

我在处理包含一些 CASE 语句并使用 LAG() 的查询时遇到问题。

我写了以下查询:

DECLARE cpi STRING DEFAULT "{cpi}";
UPDATE `table` SET
PAY_FT = CASE
WHEN RN = 1 AND cpi = "S" AND PAY_SHALE_COR = "PAY" THEN 1
WHEN RN = 1 AND cpi = "C" AND PAY_CLEAN = "PAY" THEN 1
WHEN RN = 1 THEN 0
WHEN RN > 1 AND cpi = "S" AND PAY_SHALE_COR = "PAY" THEN 0.2 + (LAG(PAY_FT, 1, 0) OVER(ORDER BY DEPTH_M))
WHEN RN > 1 AND cpi = "S" AND PAY_SHALE_COR = "PAY" THEN 0.2 + (LAG(PAY_FT, 1, 0) OVER(ORDER BY DEPTH_M))
ELSE (LAG(PAY_FT, 1, 0) OVER(ORDER BY DEPTH_M))
END
WHERE DEPTH_M IS NOT NULL

但我收到以下错误:“UPDATE 子句中不允许分析函数...”

我研究了一下,是LAG函数导致的,它使用了de OVER子句。

我的数据集上有一个名为 RN 的列,但如果有帮助,它可以使用 row_number() 函数。

我不知道该怎么做。

有人可以帮忙吗?提前致谢!

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    Big Query 允许在 UPDATE 语句中使用 FROM 子句...

    因此,您可以编写一个子查询,该查询从您的表中读取并在您的 CASE 表达式中使用 LAG()

    然后,使用UPDATEWHERE 子句将该结果集连接回目标表,使用表的主键是什么。

    UPDATE
      table t
    SET
      PAF_FT = s.PAY_FT
    FROM
    (
      SELECT
        <primary_key>,
        CASE
          WHEN RN = 1 AND cpi = "S" AND PAY_SHALE_COR = "PAY" THEN 1
          WHEN RN = 1 AND cpi = "C" AND PAY_CLEAN = "PAY" THEN 1
          WHEN RN = 1 THEN 0
          WHEN RN > 1 AND cpi = "S" AND PAY_SHALE_COR = "PAY" THEN 0.2 + (LAG(PAY_FT, 1, 0) OVER(ORDER BY DEPTH_M))
          WHEN RN > 1 AND cpi = "S" AND PAY_SHALE_COR = "PAY" THEN 0.2 + (LAG(PAY_FT, 1, 0) OVER(ORDER BY DEPTH_M))
          ELSE (LAG(PAY_FT, 1, 0) OVER(ORDER BY DEPTH_M))
        END
          AS PAY_FT
      FROM
        table
      WHERE
        DEPTH_M IS NOT NULL
    )
      s
    WHERE
      t.<primary_key> = s.<primary_key>
    

    【讨论】:

      猜你喜欢
      • 2021-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 2017-10-23
      • 1970-01-01
      • 2017-06-13
      • 1970-01-01
      相关资源
      最近更新 更多