簡體   English   中英

使用 OVER RANGE BETWEEN days 移動平均值

[英]Moving avg using OVER RANGE BETWEEN days

我想查找過去 365 天內購買的商品的平均價格。 物品不保證每天都能買到,所以無法固定回頭看的行數。 所以我嘗試使用 RANGE 而不是 ROWS,指定我從當前行的日期開始回顧 365 天。

樣本數據:

  • 按商店和項目分組
  • 我想找到過去 12 個月內購買的平均價格
店鋪 物品 購買日期 價格 過去 365 天的平均價格
商店 1 第 1 項 2022 年 1 月 2 日 1.00 1.00
商店 1 第 1 項 6/1/2022 1.75 1.375
商店 1 第 1 項 11/2/2022 2.10 1.617
商店 1 第 1 項 2023 年 1 月 5 日 3.00 2.283
店鋪 2 第 1 項 2022 年 3 月 2 日 1.55 1.55
店鋪 2 第 1 項 2022 年 5 月 5 日 2.80 2.175

我努力了:

SELECT  
    store, item, date, price,
    SUM(price) OVER (PARTITION BY store, item
                     ORDER BY date ASC
                     RANGE BETWEEN 365 DAY PRECEDING AND CURRENT ROW) AS avg_price
FROM table

我得到的錯誤是:

消息 102,15 級,State 1,第 102 行
“DAY”附近的語法不正確

我已經嘗試了這些變體來解決錯誤但無法克服它:

  1. RANGE BETWEEN '365' DAY PRECEDING AND CURRENT ROW
  2. RANGE BETWEEN INTERVAL 365 DAY PRECEDING AND CURRENT ROW
  3. RANGE BETWEEN 365 PRECEDING AND CURRENT ROW

#3 產生錯誤

Msg 4194, Level 16, State 1, Line 98
RANGE 僅支持 UNBOUNDED 和 CURRENT ROW window 幀分隔符。

這是語法錯誤嗎? 我正在使用 Microsoft SQL Server Management Studio。

SELECT  
    store, 
    item, 
    date, 
    price,
    AVG(price) AS avg_price
FROM table
WHERE
    date > (select dateadd(year, -1, getdate()));
GROUP BY
    store,
    item,
    date,
    price

WHERE查詢會將您的數據減少到去年的所有輸入。 SQL 已經帶有一個稱為AVG的平均函數。 如果您不希望所有數據都在組中,請刪除GROUP BY

一個很好的舊自連接應該可以工作(我將您的日期轉換為 ISO 格式):

with cte as (
    select *
    
    from (
        VALUES  (N'Store 1', N'Item 1', N'2022-01-02', 1.00, 1.00)
        ,   (N'Store 1', N'Item 1', N'2022-06-01', 1.75, 1.375)
        ,   (N'Store 1', N'Item 1', N'2022-11-01', 2.10, 1.617)
        ,   (N'Store 1', N'Item 1', N'2023-01-05', 3.00, 2.283)
        ,   (N'Store 2', N'Item 1', N'2022-03-02', 1.55, 1.55)
        ,   (N'Store 2', N'Item 1', N'2022-05-05', 2.80, 2.175)
    ) t (Store,Item,[Date bought],Price,[Avg price across last 365 days])
    )
select  AVG(c2.price), c.Store, c.Item, c.[Date bought]
from CTE c
LEFT JOIN CTE c2
    On  c2.Store = c.Store
    AND c2.Item = c.Item
    AND c2.[Date bought]  between DATEADD(YEAR, -1,CAST(c.[Date bought] AS DATETIME)) AND c.[Date bought]
GROUP BY c.Store, c.Item, c.[Date bought]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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