获取 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 周移动平均值的主要内容,如果未能解决你的问题,请参考以下文章

每月所有周的 SQL 平均值

SQL ORACLE 从多个日期时间行中获取周数

sql获取当前周几

sql 平均上班时间

Oracle SQL 获取本月内的所有周一

ORACLE每隔15分钟求一个平均值,怎么写sql?