能否在SQL窗口函数中添加过滤条件?是否可包裹CASE语句?
在窗口函数内实现过滤的方法
当然可以在窗口函数里实现过滤逻辑!不过窗口函数本身没法直接加WHERE子句来筛选要参与聚合的行,但你提到的用CASE语句包裹计算表达式的思路完全可行,这是业内常用的在窗口聚合中做行级过滤的技巧。
具体实现示例
基于你提供的SQL,假设你想过滤掉CONTRACTUAL_RATE为0(避免除以0错误)或者CHRG_RATE小于等于0的行,就可以把聚合的表达式用CASE包裹起来:
SELECT ROUND( SUM( CASE -- 这里写你的过滤条件,符合条件的行才参与计算 WHEN M.CONTRACTUAL_RATE != 0 AND M.CHRG_RATE > 0 THEN M.CHRG_RATE / M.CONTRACTUAL_RATE ELSE NULL -- 不符合条件的返回NULL,SUM会自动忽略这些值 END ) OVER (PARTITION BY M.PROGRAM), 0 ) AS BILLED_MEMBERS_PER_MONTH2 FROM tableA WHERE 1=1;
原理说明
CASE语句会逐行判断是否满足你设定的过滤条件:
- 满足条件的行,会计算
CHRG_RATE/CONTRACTUAL_RATE的值并传入SUM函数; - 不满足条件的行,返回
NULL,而SUM函数在计算时会自动忽略NULL值,这样就相当于只让符合条件的行参与窗口内的聚合计算,达到了窗口内过滤的效果。
你可以根据实际需求调整WHEN后面的过滤条件,比如多个条件组合、特定字段的取值范围等,都能通过这种方式实现。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

