能否通过同类型窗口表达式实现累积求和与分区特定范围求和?
能否用同一种表达式实现累积求和与分区特定范围求和?
不能用完全相同的窗口表达式同时生成这两个求和结果,因为它们的窗口帧范围(ROWS子句)逻辑完全不同:
- 累积求和需要的是从分区起始行到当前行的范围:
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - 特定范围求和需要的是当前行前后各2行的范围:
ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING
不过你可以通过定义公共的窗口框架来减少代码重复,不用重复写PARTITION BY和ORDER BY部分,示例如下:
SELECT "class", "year", "mass", -- 累积求和:复用公共窗口并指定对应帧范围 SUM("mass") OVER (common_window ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS "cumulative_sum", -- 特定范围求和:复用公共窗口并指定对应帧范围 SUM("mass") OVER (common_window ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING) AS "partition_sum" FROM your_table -- 定义公共窗口:包含分区和排序规则 WINDOW common_window AS (PARTITION BY "class" ORDER BY "year" ASC);
你原本的写法是完全正确的,上述方式只是简化了代码结构,核心逻辑还是需要针对两种求和需求分别指定对应的窗口帧范围。
内容的提问来源于stack exchange,提问作者Vaibhav Najan
相关产品推荐
相关产品推荐

