簡體   English   中英

如何獲得基於過去 12 個月的 7 天滾動平均值?

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

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