Redshift窗口函数FILTER子句不支持的条件计数实现方案
问题原因
Redshift基于旧版PostgreSQL内核,不支持窗口函数的FILTER子句语法。你最初写的SQL同时存在字段重复、多余逗号、窗口范围不符合统计逻辑的问题,无法正常运行得到预期结果。
可直接运行的Redshift兼容SQL
Redshift中实现窗口条件统计的标准方案是将条件判断嵌入CASE WHEN语句,传入聚合函数实现和FILTER完全一致的效果。针对你需要按super_location、sub_super_location分区,统计每行对应日期下condition=1的location数量的需求,代码如下:
SELECT date AS order_date, super_location, sub_super_location, location, condition, COUNT(CASE WHEN condition = 1 THEN location END) OVER ( PARTITION BY super_location, sub_super_location, date ) AS count FROM table1 ORDER BY date DESC, location;
语法说明
- 条件逻辑替换:
CASE WHEN condition = 1 THEN location END等价于FILTER (WHERE condition = 1)的判断逻辑:满足条件时返回location值参与计数,不满足时返回null,count聚合会自动跳过null值,统计结果无偏差。 - 窗口规则适配:你的需求是统计当前日期下的符合条件的记录数,不是按日期累计的历史值,因此将
date加入窗口分区键,窗口会自动匹配同上级区域、同日期的所有行,不需要额外写ORDER BY或窗口范围限定,执行效率更高,结果更稳定。 - 语法错误修复:修正了原SQL中重复选取super_location、遗漏sub_super_location、SELECT子句多余前置逗号的问题。
扩展场景(累计统计)
如果你后续需要统计截止到当前日期的历史累计符合条件的location数(而非当日值),可以将窗口定义调整为累计范围,写法如下:
COUNT(CASE WHEN condition = 1 THEN location END) OVER ( PARTITION BY super_location, sub_super_location ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS cumulative_count
内容的提问来源于stack exchange,提问作者Shrestha
相关产品推荐
相关产品推荐

