获取 Oracle SQL 的 13 周移动平均值
Posted
技术标签:
【中文标题】获取 Oracle SQL 的 13 周移动平均值【英文标题】:Get 13 weeks moving average on Oracle SQL 【发布时间】:2021-06-08 14:33:34 【问题描述】:我正在尝试获取我的库存和销售列的最近 13 周移动平均值(我有数千行,但我想从最近的回溯中获取最近 13 周移动平均值,因为每周都有新数据)。
我在那里有周号(设置为 YYYY-WEEKNO)。
有人知道我如何在 Oracle SQL 中做到这一点吗?
| weekno | inventory | sales |
| 202111| 5 | 78 |
| 202110| 6 | 50 |
| 202109| 3 | 80 |
| 202108| 2 | 75 |
| 202107| 5 | 33 |
| 202106| 8 | 77 |
| 202105| 3 | 80 |
| 202104| 2 | 75 |
| 202103| 5 | 33 |
| 202102| 8 | 77 |
| 202101| 8 | 77 |
| 202053| 2 | 75 |
| 202052| 5 | 33 |
| 202051| 8 | 77 |
| 202050| 8 | 77 |
.....等等
【问题讨论】:
您是否总是每条记录恰好有一周,即没有重复或空白? 【参考方案1】:您可以使用窗口函数。假设您有每周的数据:
select t.*,
avg(inventory) over (order by weekno rows between 12 preceding and current row),
avg(sales) over (order by weekno rows between 12 preceding and current row)
from t;
注意:这假设前 13 周包括当前周。如果没有,您将使用:
avg(sales) over (order by weekno rows between 13 preceding and 1 preceding)
【讨论】:
太棒了。你认为还有其他方法可以做到这一点吗?喜欢更优化/更快的查询方式? @KateLara 这是一个简单的选择。你觉得它怎么可能更快? 所以我想在 Oracle SQL 上使用 FISCAL_WEEK 或 DAY 表进行嵌套查询,例如:AVG(CASE WHEN weekno = WHERE DATE_DT >= TRUNC(SYSDATE) - 91 AND DATE_DT ^ 我刚刚给出的 SQL 语句不是 100%,而是类似的东西?我不确定它是否更慢。 @itskcl 。 . .窗口函数应该比子查询更快,通常更快*。以上是关于获取 Oracle SQL 的 13 周移动平均值的主要内容,如果未能解决你的问题,请参考以下文章