在带有 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
子句...
因此,您可以编写一个子查询,该查询从您的表中读取并在您的 CASE
表达式中使用 LAG()
。
然后,使用UPDATE
的WHERE
子句将该结果集连接回目标表,使用表的主键是什么。
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 语句