You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合CASE WHEN与GROUP BY实现Verhouding字段特定标记需求

解决方案:基于分组判断的标记字段生成

原始数据

PersoonIDAttributeIDStartDateEndDateVerhouding
1652542023-01-012023-02-0132
1657352023-04-012023-03-0178
1650012023-01-012023-07-0134
1650012023-01-012023-05-010
1635612023-01-012023-05-010

需求说明

原本的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;

逻辑解释

  1. 内层CASE WHEN Verhouding !=0 THEN 1 ELSE 0:先将每条记录的Verhouding转换为0/1的临时值;
  2. MAX(...) OVER (PARTITION BY PersoonID, AttributeID, StartDate):对每个分组计算临时值的最大值。如果分组内有至少一个非0的Verhouding,最大值就是1;否则为0;
  3. 外层CASE:根据分组的最大值结果,统一标记该分组所有行的verhouding_flag为1或0。

结果验证

执行上述SQL后,得到的结果如下:

PersoonIDAttributeIDStartDateEndDateVerhoudingverhouding_flag
1652542023-01-012023-02-01321
1657352023-04-012023-03-01781
1650012023-01-012023-07-01341
1650012023-01-012023-05-0101
1635612023-01-012023-05-0100

内容的提问来源于stack exchange,提问作者Psychotechnopath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 03:17:22