【问题标题】:Redshift AWS - Update table with lag() in sub query and cteRedshift AWS - 在子查询和 cte 中使用 lag() 更新表
【发布时间】:2021-07-26 00:55:53
【问题描述】:

我有一个 Redshift 数据库,其中包含以下条目: 表名 = 订阅者

time_at calc_subscribers calc_unsubscribers current_subscribers
2021-07-02 07:30:00 0 0 0
2021-07-02 07:45:00 39 8 0
2021-07-02 08:00:00 69 17 0
2021-07-02 08:15:00 67 21 0
2021-07-02 08:30:00 48 23 0

目标是用之前的值计算 current_subscribers。

current_subscribers = calc_subscribers - calc_unsubscribers + previous_current_subscribers

我执行以下操作:

UPDATE subscribers sa
  SET current_subscribers = COALESCE( sa.calc_subscribers - sa.calc_unsubscribers + sub.previous_current_subscribers,0)
  FROM (
    SELECT
      time_at,
      LAG(current_subscribers, 1) OVER
      (ORDER BY time_at desc) previous_current_subscribers
      FROM subscribers
  ) sub
  WHERE sa.time_at = sub.time_at

问题在于,在子查询“sub”中,根据表中的当前值生成了一个表,因此 previous_current_subscribers 始终为 0。而不是逐行遍历此表。所以结果是:current_subscribers = calc_subscribers - calc_unsubscribers + 0 我也已经用 CTE 试过了,可惜没有成功:

结果应该是这样的:

time_at calc_subscribers calc_unsubscribers current_subscribers
2021-07-02 07:30:00 0 0 0
2021-07-02 07:45:00 39 8 31
2021-07-02 08:00:00 69 17 83
2021-07-02 08:15:00 67 21 129
2021-07-02 08:30:00 48 95 82

我很感激任何想法。

【问题讨论】:

    标签: sql-update subquery amazon-redshift common-table-expression window-functions


    【解决方案1】:

    您遇到的问题是您想在计算当前行时使用一行的结果。这是递归的,我认为在这种情况下你可以这样做,但很昂贵。

    您要查找的结果是该行和之前行的所有 calc_subscribers 的总和减去该行和之前行的所有 calc_unsubscribers 的总和。这是 2 个窗口函数之间的区别 - 求和。

    sum(calc_subscribers) over (order by time_at desc rows unbounded preceding) - sum(calc_unsubscribers) over (order by time_at desc rows unbounded preceding) as current_subscribers
    

    【讨论】:

    • 您好比尔,感谢您的快速回答。它工作正常。第一步的成本并不重要,因为这在桌子上只执行一次。非常感谢。
    猜你喜欢
    • 2018-09-05
    • 2021-08-19
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2019-02-17
    • 1970-01-01
    相关资源
    最近更新 更多