簡體   English   中英

將當前行的值與所有先前行的平均值進行比較

[英]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.

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