在Amazon Redshift中按name列填充flag=408的前置有效值
Redshift SQL 实现分组替换flag值
需求说明
现有一张包含name、date、flag三列的表,原始数据如下:
| name | date | flag |
|---|---|---|
| One | 2023-07-10 | 1 |
| one | 2023-07-11 | 408 |
| One | 2023-07-12 | 408 |
| two | 2023-07-10 | 0 |
| two | 2023-07-11 | 0 |
| two | 2023-07-12 | 408 |
需要按name分组(不区分大小写),将flag=408的行替换为该分组中之前出现的非408的flag值,最终期望结果如下:
| name | date | flag |
|---|---|---|
| One | 2023-07-10 | 1 |
| one | 2023-07-11 | 1 |
| One | 2023-07-12 | 1 |
| two | 2023-07-10 | 0 |
| two | 2023-07-11 | 0 |
| two | 2023-07-12 | 0 |
解决方案
以下是适配Redshift的SQL查询语句:
SELECT name, date, LAST_VALUE(CASE WHEN flag != 408 THEN flag END IGNORE NULLS) OVER ( PARTITION BY LOWER(name) ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS flag FROM your_table_name;
语句解释
LOWER(name)分组:将name统一转为小写,确保One和one被归为同一分组,满足大小写不敏感的分组需求。CASE WHEN flag !=408 THEN flag END:将flag=408的行转为NULL,保留非408的原始flag值。LAST_VALUE(...) IGNORE NULLS:在每个分组内按日期顺序,取当前行及之前所有行中最后一个非NULL的flag值,自动填充flag=408对应的位置。- 窗口范围
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW:限定只取当前行之前(包括当前行)的数据,确保只使用"之前出现的"值进行填充。
内容的提问来源于stack exchange,提问作者Kavya shree
相关产品推荐
相关产品推荐

