[英]How do I get 7 day rolling average based on the last 12 months?
我有以下數據示例:
日期 | 數量 |
---|---|
2020-01-01 | 3500.03 |
2020-01-01 | 3000.03 |
2020-01-01 | 3200.86 |
2020-01-01 | 4500.00 |
2020-02-01 | 2100.23 |
2020-02-01 | 1000.00 |
2020-03-01 | 2800.93 |
ETC | ETC |
數據是這樣持續的,涵蓋了幾年的時間。 我的目標是根據前 12 個月找到 7 天的滾動平均值。 我一直在嘗試使用 window function 但是我得到了非常錯誤的結果,盡管進行了研究,我還是沒有想法。 如果有人可以幫助我,我將不勝感激。
編輯,我嘗試的確切代碼在我目前無法訪問的另一台機器上,但我嘗試如下:
SELECT
DATE
,AMOUNT
,SUM(AMOUNT) OVER(PARTITION BY DATE ORDER BY DATE ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS WEEKAVG
FROM TABLE
有很多方法可以給這只貓剝皮——特別是如果你關心最大性能——但一種方法是這樣的:
WITH
DailyAmounts AS
(
SELECT
Date,
SUM(Amount) AS DailyAmount
FROM
Table
GROUP BY
Date
) DailyAmounts
SELECT
*,
(
SELECT
SUM(DailyAmount)
FROM
DailyAmounts DailyAmounts2
WHERE
Date BETWEEN
DATEADD(DAY, -6, DailyAmounts.Date)
AND DailyAmounts.Date
) AS WeeklyAverageAmount
FROM
DailyAmounts
;
本質上,通過 CTE 創建每日金額表; 然后,添加每周平均列並通過同一 CTE 上的子查詢進行填充。
如果我理解正確。 你需要每周平均。 你可以這樣使用:
set datefirst 1;
WITH tempTable AS (SELECT datepart(week, yourDateColumn) as weekNr, amount from testTable)
Select weekNr, SUM(amount) from tempTable
group by weekNr
如果您需要每日平均數據查詢可以是這樣的:
WITH tempTable AS (SELECT DATENAME(WEEKDAY, yourDateColumn) AS weekDay, amount from testTable)
Select weekDay, SUM(amount) from tempTable
group by weekDay
似乎您可以在這里使用 window function 。
您只需要確保您的數據每天只有一行。 您可以通過先分組來做到這一點。
SELECT
*,
SUM(DailyAmount) OVER (ORDER BY Date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS WeeklyAverageAmount
FROM (
SELECT
t.Date,
SUM(t.Amount) AS DailyAmount
FROM YourTable t
GROUP BY
t.Date
) ByDay;
請注意,求和或相加會產生總計而不是平均值。
您的示例數據僅在一個月的第一天有多行,因此我看不出您如何從中獲得 7 天的平均值。 (除非您使用 yyyy-dd-MM 格式,但我從未見過有人這樣做。)
如果您正在尋找特定的日期范圍,通常不應依賴行數 - 而應查看日期本身。
所以,我不太確定你在尋找什么,但也許這可以幫助你走上正軌:
-- prep data
select *
into #tmp
from ( values
('2020-01-01', 3500.03),
('2020-01-01', 3000.03),
('2020-01-01', 3200.86),
('2020-01-01', 4500.00),
('2020-02-01', 2100.23),
('2020-02-01', 1000.00),
('2020-03-01', 2800.93)
)t(date, amount)
-- output
select
t.Date
,t.amount
,sum(amount) over (order by date) as running_total
,avg(amount) over (order by date) as running_avg
,tca.rolling_sevenday_total
,tca.rolling_sevenday_avg
from #tmp t
cross apply (
select
sum(amount) as rolling_sevenday_total,
avg(amount) as rolling_sevenday_avg
from #tmp t7
where
t7.date between dateadd(dd, -7, t.date) and t.date
) tca
日期 | 數量 | running_total | running_avg | rolling_sevenday_total | rolling_sevenday_avg |
---|---|---|---|---|---|
2020-01-01 | 3500.03 | 14200.92 | 3550.230000 | 14200.92 | 3550.230000 |
2020-01-01 | 3000.03 | 14200.92 | 3550.230000 | 14200.92 | 3550.230000 |
2020-01-01 | 3200.86 | 14200.92 | 3550.230000 | 14200.92 | 3550.230000 |
2020-01-01 | 4500.00 | 14200.92 | 3550.230000 | 14200.92 | 3550.230000 |
2020-02-01 | 2100.23 | 17301.15 | 2883.525000 | 3100.23 | 1550.115000 |
2020-02-01 | 1000.00 | 17301.15 | 2883.525000 | 3100.23 | 1550.115000 |
2020-03-01 | 2800.93 | 20102.08 | 2871.725714 | 2800.93 | 2800.930000 |
如果您的數據實際上是每天的數據,這就是您的數據的樣子
-- prep data
select *
into #tmp2
from ( values
('2020-01-01', 3500.03),
('2020-01-02', 3000.03),
('2020-01-03', 3200.86),
('2020-01-04', 4500.00),
('2020-01-05', 4500.00),
('2020-01-06', 4500.00),
('2020-01-07', 4500.00),
('2020-02-01', 2100.23),
('2020-02-02', 1000.00),
('2020-02-03', 2800.93)
)t(date, amount)
-- output
select
t.Date
,t.amount
,sum(amount) over (order by date) as running_total
,avg(amount) over (order by date) as running_avg
,tca.rolling_sevenday_total
,tca.rolling_sevenday_avg
from #tmp2 t
cross apply (
select
sum(amount) as rolling_sevenday_total,
avg(amount) as rolling_sevenday_avg
from #tmp2 t7
where
t7.date between dateadd(dd, -7, t.date) and t.date
) tca
日期 | 數量 | running_total | running_avg | rolling_sevenday_total | rolling_sevenday_avg |
---|---|---|---|---|---|
2020-01-01 | 3500.03 | 3500.03 | 3500.030000 | 3500.03 | 3500.030000 |
2020-01-02 | 3000.03 | 6500.06 | 3250.030000 | 6500.06 | 3250.030000 |
2020-01-03 | 3200.86 | 9700.92 | 3233.640000 | 9700.92 | 3233.640000 |
2020-01-04 | 4500.00 | 14200.92 | 3550.230000 | 14200.92 | 3550.230000 |
2020-01-05 | 4500.00 | 18700.92 | 3740.184000 | 18700.92 | 3740.184000 |
2020-01-06 | 4500.00 | 23200.92 | 3866.820000 | 23200.92 | 3866.820000 |
2020-01-07 | 4500.00 | 27700.92 | 3957.274285 | 27700.92 | 3957.274285 |
2020-02-01 | 2100.23 | 29801.15 | 3725.143750 | 2100.23 | 2100.230000 |
2020-02-02 | 1000.00 | 30801.15 | 3422.350000 | 3100.23 | 1550.115000 |
2020-02-03 | 2800.93 | 33602.08 | 3360.208000 | 5901.16 | 1967.053333 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.