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

如何在WHERE子句中使用含CASE WHEN的MAX() OVER()过滤数据?

问题原因与解决方案

你的SQL无法运行的核心原因是:WHERE子句不能直接使用窗口函数。SQL的执行顺序是先执行WHERE过滤数据,再计算窗口函数,所以WHERE子句无法识别窗口函数生成的列。

要实现单语句完成需求,你可以通过子查询或**CTE(公共表表达式)**先计算出每个ID的最新状态日期,再在外层进行过滤,两种方法都不需要临时表:

方案一:子查询实现

SELECT ID, STATUS, DESCRIPTION, LATEST_STATUS_DATE
FROM (
    SELECT 
        A1.ID, A1.STATUS, A1.DESCRIPTION,
        MAX(CASE 
                WHEN A1.DESCRIPTION IS NOT NULL AND A1.STATUS = 'C'
                THEN A1.STATUS_DATE
                ELSE NULL
        END) OVER (PARTITION BY A1.ID) AS LATEST_STATUS_DATE
    FROM myTable A1
) AS sub
WHERE LATEST_STATUS_DATE >= '20220101'

方案二:CTE实现(可读性更强)

WITH status_cte AS (
    SELECT 
        A1.ID, A1.STATUS, A1.DESCRIPTION,
        MAX(CASE 
                WHEN A1.DESCRIPTION IS NOT NULL AND A1.STATUS = 'C'
                THEN A1.STATUS_DATE
                ELSE NULL
        END) OVER (PARTITION BY A1.ID) AS LATEST_STATUS_DATE
    FROM myTable A1
)
SELECT ID, STATUS, DESCRIPTION, LATEST_STATUS_DATE
FROM status_cte
WHERE LATEST_STATUS_DATE >= '20220101'

补充说明

两种方案逻辑完全一致,都是先通过窗口函数计算出每个ID的LATEST_STATUS_DATE,再在外层筛选出该日期大于等于2022-01-01的数据,符合你“单条语句完成”的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:17:37