[英]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)
PARTITION BY
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
您在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.