在带有 CASE 语句的 UPDATE 上使用 LAG()

Posted

技术标签:

【中文标题】在带有 CASE 语句的 UPDATE 上使用 LAG()【英文标题】:Using LAG() on an UPDATE with CASE statements 【发布时间】: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() 函数。

我不知道该怎么做。

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

【问题讨论】:

【参考方案1】:

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

https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#update_statement

因此,您可以编写一个子查询,该查询从您的表中读取并在您的 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>

【讨论】:

以上是关于在带有 CASE 语句的 UPDATE 上使用 LAG()的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL:在 UPDATE 语句中使用 CASE 根据条件更新某些列

LIKE 在 CASE 语句中 Oracle SQL (Sql Developer)

Redshift 中的 update + case + join 语句

MySQL:是否有可能在UPDATE上CASE一个FIELD?

我可以使用带有两个变量的case / switch语句吗?

我可以使用带有两个变量的 case/switch 语句吗?