You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

这段的逻辑是:

  1. 先按productid和date分组(相当于先计算每个商品每日的平均价格,假设原表中同一商品同一日期有多条销售记录)。
  2. 再通过窗口函数,对每个商品按日期排序,计算当前日期及之前6天(共7天)的平均价格,也就是每个商品的每日移动7日均值。
  3. 这段没有日期筛选条件,会计算全量历史数据的移动均值,而非仅最近7天的数据。

关键差异总结

  1. 计算维度不同:第一段是「每日全商品均价」,第二段是「每个商品的移动7日均价」。
  2. 数据范围不同:第一段(修正后)仅计算最近7天,第二段计算所有历史数据。
  3. 第一段存在语法/逻辑错误无法正常执行,第二段语法合法(假设price是聚合后的列或原表中商品+日期唯一)。

内容的提问来源于stack exchange,提问作者Taylor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:19:50