[英]Compare value of current row to average of all previous rows
我希望將每個日期的值與所有先前日期的平均值進行比較,並計算百分比變化。 例如,在下面的源表中,我想將 2022 年 12 月的值 100 與 11 月、10 月和 9 月的平均值 ((75+60+75)/3) 進行比較,以恢復 0.43 的變化。
源表
日期 | 價值 |
---|---|
2022 年 12 月 | 100 |
2022 年 11 月 | 75 |
2022 年 10 月 | 60 |
2022 年 9 月 | 75 |
所需 Output
日期 | 價值 | 比較 |
---|---|---|
2022 年 12 月 | 100 | 0.43 |
2022 年 11 月 | 75 | 0.11 |
2022 年 10 月 | 60 | -0.20 |
2022 年 9 月 | 75 | - |
您需要一個帶有OVER
子句的窗口化AVG
,該子句使用適當的行范圍( ORDER BY [Date] ASC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
):
測試數據:
SELECT *
INTO Data
FROM (VALUES
(20221201, 100),
(20221101, 75),
(20221001, 60),
(20220901, 75)
) v ([Date], [Value])
陳述:
SELECT [Date], [Value], ([Value] - [Average]) * 1.00 / [Average] AS [Comparison]
FROM (
SELECT
*,
[Average] = AVG([Value]) OVER (ORDER BY [Date] ASC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
FROM Data
) t
ORDER BY [Date] DESC
結果(沒有四舍五入):
日期 | 價值 | 比較 |
---|---|---|
20221201 | 100 | 0.4285714285714 |
20221101 | 75 | 0.1194029850746 |
20221001 | 60 | -0.2000000000000 |
20220901 | 75 | null |
drop table #t
select *
into #t
from
(
VALUES (1,N'December 2022', 100.0)
, (2,N'November 2022', 75.0)
, (3,N'October 2022', 60.0)
, (4,N'September 2022', 75.0)
) t (sort, col1,col2)
select col2, (col2 - AVG(col2) OVER(ORDER BY sort DESC ROWS between UNBOUNDED PRECEDING and 1 PRECEDING)) / AVG(col2) OVER(ORDER BY sort DESC ROWS between UNBOUNDED PRECEDING and 1 PRECEDING)
, AVG(col2) OVER(ORDER BY sort DESC)
from #t
order by sort
像這樣的東西。 不過要注意 0 值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.