关于rows between 7 preceding and 1 preceding的功能及结果验证问询
窗口子句
rows between 7 preceding and 1 preceding作用解析及结果验证 一、窗口子句rows between 7 preceding and 1 preceding的作用
这个子句用于定义窗口函数的计算行范围,结合你给出的SQL语句sum(VALUE) over(partition by (COUNTRY_CODE, ID) order by Date rows between 7 preceding AND 1 preceding),具体逻辑如下:
partition by (COUNTRY_CODE, ID):将数据按国家编码和标识ID分组,每组内独立计算聚合值order by Date:每组内的行按日期升序排列rows between 7 preceding and 1 preceding:指定聚合计算的行范围是当前行之前的第7行到当前行的前一行(不包含当前行):- 如果当前行是组内第1行,无任何前序行,聚合结果为
null - 如果当前行前序行不足7行,就取所有存在的前序行(比如组内第3行,前序有2行,则取这2行参与计算)
- 最多取当前行之前的7行数据进行求和
- 如果当前行是组内第1行,无任何前序行,聚合结果为
二、目标结果验证
你的目标表结果无法通过当前SQL语句得到,具体分析如下:
源表排序后数据(按Date升序)
| 日期 | 标识(ID) | 数值(Value) | 国家(country) |
|---|---|---|---|
| 2018-07-30 | 01 | 6037.2 | US |
| 2018-11-05 | 01 | 971.02 | US |
| 2018-11-12 | 01 | 1915.06 | US |
| 2019-01-17 | 01 | 5074.01 | US |
| 2019-07-17 | 01 | 7659.21 | US |
| 2021-02-09 | 01 | 2867.45 | US |
| 2021-10-07 | 01 | 2884.65 | US |
当前SQL语句的计算结果
按rows between 7 preceding and 1 preceding计算每行的7D_Spend:
- 2018-07-30:无前行 →
null(和目标表一致) - 2018-11-05:前1行是2018-07-30 → sum=6037.2(目标表为
null,不一致) - 2018-11-12:前2行是2018-07-30、2018-11-05 → sum=6037.2+971.02=7008.22(目标表为971.02,不一致)
- 后续行的前序行更多,求和值远大于目标表的
null,均不一致
目标表结果对应的正确逻辑
目标表的7D_Spend是按**日期范围(当前日期的前7天到前1天)**计算的,而非行数量。要得到该结果,需要使用基于日期范围的窗口子句(以PostgreSQL为例):
sum(VALUE) over( partition by (COUNTRY_CODE, ID) order by Date range between interval '7 days' preceding and interval '1 day' preceding ) as 7D_Spend
该语句会筛选出当前日期往前推7天到前1天内的行进行求和,和你的目标表结果完全匹配:
- 2018-11-12的前7天是2018-11-05,仅2018-11-05的行在范围内,sum=971.02
- 其他行的日期区间内无有效数据,结果为
null
内容的提问来源于stack exchange,提问作者testenthu
相关产品推荐
相关产品推荐

