[英]Moving avg using OVER RANGE BETWEEN days
我想查找過去 365 天內購買的商品的平均價格。 物品不保證每天都能買到,所以無法固定回頭看的行數。 所以我嘗試使用 RANGE 而不是 ROWS,指定我從當前行的日期開始回顧 365 天。
樣本數據:
店鋪 | 物品 | 購買日期 | 價格 | 過去 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”附近的語法不正確
我已經嘗試了這些變體來解決錯誤但無法克服它:
RANGE BETWEEN '365' DAY PRECEDING AND CURRENT ROW
RANGE BETWEEN INTERVAL 365 DAY PRECEDING AND CURRENT ROW
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.