【发布时间】: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