如何在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
相关产品推荐
相关产品推荐

