【问题标题】:Get 13 weeks moving average on Oracle SQL获取 Oracle SQL 的 13 周移动平均值
【发布时间】: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 |

.....等等

【问题讨论】:

  • 您是否总是每条记录恰好有一周,即没有重复或空白?

标签: sql oracle oracle-sqldeveloper


【解决方案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 。 . .窗口函数应该比子查询更快,通常更快*。
猜你喜欢
  • 2021-06-14
  • 1970-01-01
  • 2023-03-25
  • 2017-11-12
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
相关资源
最近更新 更多