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

如何使用CASE WHEN子句返回日期类型并关联test统计字段

SQL修正方案

原代码核心问题是CTE中的GROUP BY错误携带了t_date字段,导致三个SUM窗口函数仅能统计单日数据,无法得到员工维度下的时间窗口计数,也无法关联对应窗口的极值日期。

修正逻辑步骤

  • 调整CTE聚合粒度为员工维度,去掉GROUP BY中的t_date字段
  • 聚合时除了计算test_01/test_02/test_03三个窗口计数字段,同步计算规则需要的两个极值日期:近5天窗口的最大日期、15-30天窗口的最小日期
  • 在外层查询通过CASE WHEN按照给定规则匹配赋值目标日期

修正后完整代码

WITH t_summary AS (
    SELECT 
        empid,
        result,
        -- 三个时间窗口计数统计
        SUM(CASE WHEN t_date >= SYSDATE - 5 THEN 1 ELSE 0 END) AS test_01,
        SUM(CASE WHEN t_date >= SYSDATE - 30 THEN 1 ELSE 0 END) AS test_02,
        SUM(CASE WHEN t_date < SYSDATE - 15 AND t_date >= SYSDATE - 30 THEN 1 ELSE 0 END) AS test_03,
        -- 预计算规则需要的窗口极值日期
        MAX(CASE WHEN t_date >= SYSDATE - 5 THEN t_date ELSE NULL END) AS max_test01_date,
        MIN(CASE WHEN t_date < SYSDATE - 15 AND t_date >= SYSDATE - 30 THEN t_date ELSE NULL END) AS min_test03_date
    FROM employees
    WHERE 
        result = 'TRUE'
        AND t_date >= SYSDATE - 30
    GROUP BY empid, result
)
SELECT 
    empid,
    result,
    CASE
        WHEN test_01 > 0 AND test_02 = 0 THEN max_test01_date
        WHEN test_01 > 0 AND test_03 > 0 THEN min_test03_date
        -- 其余场景可根据业务需求补充赋值逻辑,无匹配时默认返回NULL
        ELSE NULL
    END AS t_date
FROM t_summary;

逻辑注意点

你定义的第一个判断条件test_01 > 0 AND test_02 = 0存在天然逻辑互斥:test_01统计的近5天范围完全包含在test_02统计的近30天范围内,只要test_01计数大于0,test_02计数必然大于等于test_01,不可能为0,该分支永远不会触发。如果是规则笔误,比如实际需求是「近5天有记录、15-30天区间无记录时取近5天最大日期」,将第一个条件修改为test_01 > 0 AND test_03 = 0即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:01:07