DATEADD实现移动7日均值与窗口函数SQL的结果是否一致?
这两段SQL不会返回相同结果,核心差异及问题分析如下:
第一段SQL的问题与逻辑
先看原代码:
Select productid, avg(price) as avgPrice, date as salesDate from sales where date between getdate() and dateadd(day, -7, getdate) group by date
这段存在多处问题:
- 语法错误:
dateadd函数的第三个参数getdate少了括号,应为getdate();另外group by date但select中包含未聚合的productid,不符合SQL聚合规则,多数数据库会直接报错。 - 逻辑错误:日期筛选范围写反了,
getdate()是当前日期,比dateadd(day, -7, getdate())(7天前的日期)大,between要求左值≤右值,所以这个条件会筛选不到任何数据。
就算修正所有错误,这段逻辑也是筛选最近7天的所有销售数据,按日期分组计算当日所有商品的平均价格,并非按商品维度的移动7日均值。
第二段SQL的逻辑与差异
原代码:
select productid, avg(price) over (partition by productid order by date rows between 6 preceding and current row) as avgPrice, date as salesDate from sales group by productid, date
这段的逻辑是:
- 先按
productid和date分组(相当于先计算每个商品每日的平均价格,假设原表中同一商品同一日期有多条销售记录)。 - 再通过窗口函数,对每个商品按日期排序,计算当前日期及之前6天(共7天)的平均价格,也就是每个商品的每日移动7日均值。
- 这段没有日期筛选条件,会计算全量历史数据的移动均值,而非仅最近7天的数据。
关键差异总结
- 计算维度不同:第一段是「每日全商品均价」,第二段是「每个商品的移动7日均价」。
- 数据范围不同:第一段(修正后)仅计算最近7天,第二段计算所有历史数据。
- 第一段存在语法/逻辑错误无法正常执行,第二段语法合法(假设
price是聚合后的列或原表中商品+日期唯一)。
内容的提问来源于stack exchange,提问作者Taylor
相关产品推荐
相关产品推荐

