簡體   English   中英

如何計算運行平均值

[英]How to Calculate Running Averages

設想:

我想計算到目前為止發生的整個月份的銷售額的移動平均值。 每個月都有不同的天數。 如果 sales_amount 為 0,則表示該人有休息日,我需要忽略該值。

樣本數據:

sales_amount    date         
100            2021-04-01    
200            2021-04-02    
300            2021-04-03    
0              2021-04-04    
100            2021-04-05    

Finalmoving_average 值為 (100 + 200 + 300 + 100) / (4),因為我們忽略了 4 月 4 日,因為它的銷售額為 0。

我在這個網站上發現的不符合我的需求: https://www.sqlservercentral.com/articles/calculate-moving-averages-using-t-sql-in-sql-server但它是一定的天數,當每個月有不同的天數並且我想忽略某些行時,我該如何應用它?

預期結果:

sales_amount    date         moving_average
100            2021-04-01    100
200            2021-04-02    150
300            2021-04-03    200
0              2021-04-04    200
100            2021-04-05    175 

我嘗試過做的事情:

AVG (Sales_Amount) OVER (
Partition BY [Date]
Order by [Date]
,Rows Between Unbounded Preceding and Current Row)
  1. 刪除PARTITION BY
  2. Sales_Amount上使用NULLIF()因為您對0不感興趣

ROWS之前還有一個額外的逗號


AVG ( NULLIF(Sales_Amount, 0) ) 
    OVER 
    (
        Order by [Date]
        Rows Between Unbounded Preceding and Current Row
    )

您可以嘗試使用 2 個聚合 window 函數來制作它,一個用於計算您的邏輯,另一個用於累積sales_amount

SELECT *,
       SUM(sales_amount) OVER(Order by [Date])/
       SUM(CASE WHEN sales_amount<>0 THEN 1 ELSE 0 END) OVER(Order by [Date]) moving_average
FROM T

sqlfiddle

您在ROWS之前有語法錯誤,不需要按日期分區。 但實際上並不需要ROWS 這應該做你想要的:

AVG(NULLIF(Sales_Amount, 0)) OVER (Order by [Date])

如果您有重復的日期,那么您可能需要指定一個 window 框架——但您需要解釋如何處理重復的日期。

您可以使用相關查詢,這樣對於小於外部查詢的內部查詢的所有日期,都會考慮進行平均計算。

SELECT [sales_amount], [date], 
      (SELECT AVG(NULLIF(T2.sales_amount, 0)) 
       FROM your_table T2 
       WHERE T2.orderdate <= T1.orderdate
      ) AS 'moving_average'
FROM your_table T1
ORDER BY T1.date

它將考慮所有 [date] 小於或等於當前行 [date] 的行並計算它們的平均值。 正如@Squirrel 所提到的, NULLIF(T2.sales_amount, 0) 應該在平均計算中跳過 0 值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM