我有如下表格;
CREATE TABLE cat (
c_id int,
c_date DATE,
c_sit VARCHAR(3),
c_value int,
c_category VARCHAR(1)
);
具有以下数据:
c_id | c_date | c_sit | c_value |
---|---|---|---|
147121 | 2022-06-06 | 25 | 4 |
147122 | 2022-06-06 | 23 | 3 |
147123 | 2022-06-07 | 25 | 5 |
147124 | 2022-11-23 | 25 | 1 |
147125 | 2022-11-16 | 25 | 3 |
147126 | 2023-10-08 | 25 | 2 |
147127 | 2023-10-09 | 25 | 5 |
147128 | 2022-04-14 | 25 | 4 |
147129 | 2022-04-15 | 25 | 6 |
147130 | 2022-04-16 | 25 | 1 |
column
c_category
为空,需要确定其值。我需要一个针对 REDSHIFT 的 SQL 查询,这样;
如果
c_sit='25'
和一个月的 c_value
之和 > 7,则该月的所有行将在 c_category 列中有 'a',否则在 c_category
列中有 'b'。
结果是;
(c_id, c_date, c_sit, c_value, c_category)
(147121,'2022-06-06','25',4,'a'),
(147122,'2022-06-06','23',3,''),
(147123,'2022-06-07','25',5,'a'),
(147124,'2022-11-23','25',1,'b'),
(147125,'2022-11-16','25',3,'b'),
(147126,'2023-10-08','25',2,'b'),
(147127,'2023-10-09','25',5,'b'),
(147128,'2022-04-14','25',4,'a'),
(147129,'2022-04-15','25',6,'a'),
(147130,'2022-04-16','25',1,'a');
UPDATE cat
SET c_category = CASE
WHEN c_sit = '25' AND
SUM(c_value) OVER (PARTITION BY DATE_TRUNC('month', c_date)) > 7
THEN 'a'
ELSE 'b'
END;
我使用了 UPDATE 将用于修改行的语句(在这种情况下是 c_category)。
CASE语句-它的作用是检查是否满足特定条件,如果满足则返回一个值。因此在这种情况下,它检查c_sit是否等于25以及一个月内的总和c_value大于 7,如果为真,则 c_category 等于 'a',否则为 'b'。
SUM 函数 - 它的目的是计算每个月的 c_value 总和,使用 PARTITION BY 按月对数据进行分组。
现在最后是 DATE_TRUNC 函数将 c_date 字段截断到月初,这样我们就可以按月分组了。
资源: