如何结合CASE WHEN与GROUP BY实现Verhouding字段特定标记需求
解决方案:基于分组判断的标记字段生成
原始数据
| PersoonID | AttributeID | StartDate | EndDate | Verhouding |
|---|---|---|---|---|
| 16525 | 4 | 2023-01-01 | 2023-02-01 | 32 |
| 16573 | 5 | 2023-04-01 | 2023-03-01 | 78 |
| 16500 | 1 | 2023-01-01 | 2023-07-01 | 34 |
| 16500 | 1 | 2023-01-01 | 2023-05-01 | 0 |
| 16356 | 1 | 2023-01-01 | 2023-05-01 | 0 |
需求说明
原本的CASE WHEN语句仅根据单条记录的Verhouding值标记verhouding_flag:
SELECT table.*, CASE WHEN Verhouding != 0 THEN 1 ELSE 0 END AS verhouding_flag FROM table
但需要补充规则:当同一PersoonID+AttributeID+StartDate分组内同时存在Verhouding为0和非0的记录时,该分组内所有行(包括Verhouding=0的行)的verhouding_flag都标记为1;只有当分组内所有记录的Verhouding都是0时,verhouding_flag才为0。
实现方案
使用窗口函数MAX()结合分区(PARTITION BY)来判断分组内是否存在非0的Verhouding值,再结合CASE逻辑生成标记:
SELECT t.*, CASE WHEN MAX(CASE WHEN Verhouding != 0 THEN 1 ELSE 0 END) OVER (PARTITION BY PersoonID, AttributeID, StartDate) = 1 THEN 1 ELSE 0 END AS verhouding_flag FROM your_table_name t;
逻辑解释
- 内层
CASE WHEN Verhouding !=0 THEN 1 ELSE 0:先将每条记录的Verhouding转换为0/1的临时值; MAX(...) OVER (PARTITION BY PersoonID, AttributeID, StartDate):对每个分组计算临时值的最大值。如果分组内有至少一个非0的Verhouding,最大值就是1;否则为0;- 外层CASE:根据分组的最大值结果,统一标记该分组所有行的
verhouding_flag为1或0。
结果验证
执行上述SQL后,得到的结果如下:
| PersoonID | AttributeID | StartDate | EndDate | Verhouding | verhouding_flag |
|---|---|---|---|---|---|
| 16525 | 4 | 2023-01-01 | 2023-02-01 | 32 | 1 |
| 16573 | 5 | 2023-04-01 | 2023-03-01 | 78 | 1 |
| 16500 | 1 | 2023-01-01 | 2023-07-01 | 34 | 1 |
| 16500 | 1 | 2023-01-01 | 2023-05-01 | 0 | 1 |
| 16356 | 1 | 2023-01-01 | 2023-05-01 | 0 | 0 |
内容的提问来源于stack exchange,提问作者Psychotechnopath
相关产品推荐
相关产品推荐

