SQL如何按id列分区计算大于当前month_diff的3个领先value的和
实现方案
你可以使用带滑动窗口框架的聚合窗口函数实现需求,核心逻辑是按id分组后,按month_diff升序排序,取当前行之后的3行Value求和即可,以下是通用SQL实现:
SELECT id, month_diff, Value, SUM(Value) OVER( PARTITION BY id ORDER BY month_diff ASC ROWS BETWEEN 1 FOLLOWING AND 3 FOLLOWING ) AS target_result FROM 你的表名
逻辑说明
PARTITION BY id:按id列分组,不同id的计算完全隔离ORDER BY month_diff ASC:分组内按month_diff从小到大排序,保证取到的后续行都是month_diff大于当前行的记录ROWS BETWEEN 1 FOLLOWING AND 3 FOLLOWING:限定窗口范围为当前行之后的第1行到第3行,刚好覆盖你需要的3个符合条件的leading value- 如果某行后续不足3条记录,求和结果会自动取实际存在的后续行的总和,如果没有后续行结果为NULL,你也可以搭配
COALESCE函数把NULL转为0
该语法适配所有支持标准SQL窗口函数的数据库,包括MySQL 8.0+、PostgreSQL、Spark SQL、Hive、Presto等。
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

