【问题标题】:SQL - Update a table using LAG and based on another columnSQL - 使用 LAG 并基于另一列更新表
【发布时间】:2021-05-24 19:27:19
【问题描述】:

我有一个带有 python 和 dash/plotly 的仪表板,它接收来自用户的输入,然后在 Google BigQuery 上运行查询。

其中一个查询更新一列 (PAY_FT),使用另一列 (PAY_CLEAN) 和来自仪表板的字符串输入。

    DECLARE cpi STRING DEFAULT "C";
    UPDATE `xx.yy.zz` t
    SET
    PAY_FT = s.PAY_FT
    FROM
    (
    SELECT
        RN,
        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) OVER(ORDER BY RN))
        WHEN RN > 1 AND cpi = "C" AND PAY_CLEAN = "PAY" THEN 0.2 + (LAG(PAY_FT, 1) OVER(ORDER BY RN))
        ELSE (LAG(PAY_FT, 1) OVER(ORDER BY RN))
        END
        AS PAY_FT
    FROM
        `xx.yy.zz`
    WHERE
        DEPTH_M IS NOT NULL
    )
    s
    WHERE
    t.RN = s.RN

但它没有按预期工作。此查询返回以下内容:

它一直工作到 DEPTH_M = 102.2,但之后它不会从上一行返回 0.4。因此,例如,如果我们在 DEPTH_M = 103.2 中有一个“PAY”,则在 103.0 之前应该返回 0.4,在 103.2 中应该返回 0.6。

我该如何解决?

这是我的数据示例:SAMPLE.csv

我想要的输出应该是:

DEPTH_M PAY_CLEAN PAY_FT
101.2 PAY 0.2
101.4 PAY 0.4
101.6 - 0.4
101.8 - 0.4
102.0 - 0.4
102.2 - 0.4
102.4 - 0.4
102.6 - 0.4
102.8 - 0.4
103.0 - 0.4
103.2 - 0.4
103.4 - 0.4

假设我们在另一行得到另一个 PAY,输出应该是:

DEPTH_M PAY_CLEAN PAY_FT
101.2 PAY 0.2
101.4 PAY 0.4
101.6 - 0.4
101.8 - 0.4
102.0 - 0.4
102.2 - 0.4
102.4 - 0.4
102.6 - 0.4
102.8 - 0.4
103.0 PAY 0.6
103.2 - 0.6
103.4 - 0.6

提前致谢。

【问题讨论】:

  • 能否请您发布您的原始表结构和一些示例数据,以便帮助我们找出条件是否是罪魁祸首?
  • @khan 我编辑了我的帖子以包含带有示例数据的 csv。
  • 您能否详细说明一下,并指定预期的输出?我仍然不确定您需要在这里解决什么问题。
  • @daniellidio 向我们展示您想要的输出
  • @daniellidio 等等,PAY_FT 是您正在制作的新栏目还是现有栏目?您的示例数据中有该列,并且您正在创建一个具有相同名称的新列。

标签: sql google-bigquery


【解决方案1】:

第二个想法你可以使用这个更简单的查询,做你想做的事,你不需要检查 RN:

SELECT RN
    ,0.2 * COUNT(CASE WHEN (cpi = "S" AND PAY_SHALE_COR = "PAY") 
              OR (cpi = "C" AND PAY_CLEAN = "PAY") THEN 1 END) OVER (ORDER BY RN) 
 + SUM(CASE WHEN RN = 1 AND ((cpi = "S" AND PAY_SHALE_COR = "PAY") 
   OR (cpi = "C" AND PAY_CLEAN = "PAY")) THEN 0.8 ELSE 0 end) OVER () NEW_Pay_FT
FROM `xx.yy.zz`
WHERE DEPTH_M IS NOT NULL

【讨论】:

  • 非常感谢!我将您的查询合并到我的查询中以用作更新,它有效!
猜你喜欢
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多