我有下表顯示客戶何時購買某種產品。我擁有的資料是CustomerID, Amount, Dat. 我正在嘗試創建列ProductsIn30Days,該列表示客戶在Dat-30包括當天在內的天數范圍內購買了多少產品。
例如,ProductsIn30Days對于25.3.2020 的CustomerID1Dat是 7,因為客戶在 25.3.2020 購買了 2 件產品,并在 24.3.2020 購買了另外 5 件產品,這在 25.3.2020 之前的 30 天內。
| 顧客ID | 數量 | 資料 | 產品在30天 |
|---|---|---|---|
| 1 | 1 | 23.3.2018 | 1 |
| 1 | 2 | 24.3.2020 | 2 |
| 1 | 3 | 24.3.2020 | 5 |
| 1 | 2 | 25.3.2020 | 7 |
| 1 | 2 | 24.5.2020 | 2 |
| 1 | 1 | 15.6.2020 | 3 |
| 2 | 7 | 24.3.2017 | 7 |
| 2 | 2 | 24.3.2020 | 2 |
我嘗試了這樣的事情但沒有成功,因為磁區只能在單個日期上作業,而不是在我需要的范圍內作業:
select CustomerID, Amount, Dat,
sum(Amount) over (partition by CustomerID, Dat-30)
from table
謝謝你的幫助。
uj5u.com熱心網友回復:
您可以使用SUM帶有范圍視窗的決議函式:
SELECT t.*,
SUM(Amount) OVER (
PARTITION BY CustomerID
ORDER BY Dat
RANGE BETWEEN INTERVAL '30' DAY PRECEDING AND CURRENT ROW
) AS ProductsIn30Days
FROM table_name t;
其中,對于樣本資料:
CREATE TABLE table_name (CustomerID, Amount, Dat) AS
SELECT 1, 1, DATE '2018-03-23' FROM DUAL UNION ALL
SELECT 1, 2, DATE '2020-03-24' FROM DUAL UNION ALL
SELECT 1, 3, DATE '2020-03-24' FROM DUAL UNION ALL
SELECT 1, 2, DATE '2020-03-25' FROM DUAL UNION ALL
SELECT 1, 2, DATE '2020-05-24' FROM DUAL UNION ALL
SELECT 1, 1, DATE '2020-06-15' FROM DUAL UNION ALL
SELECT 2, 7, DATE '2017-03-24' FROM DUAL UNION ALL
SELECT 2, 2, DATE '2020-03-24' FROM DUAL;
輸出:
顧客ID 數量 資料 產品30天 1 1 2018-03-23 00:00:00 1 1 2 2020-03-24 00:00:00 5 1 3 2020-03-24 00:00:00 5 1 2 2020-03-25 00:00:00 7 1 2 2020-05-24 00:00:00 2 1 1 2020-06-15 00:00:00 3 2 7 2017-03-24 00:00:00 7 2 2 2020-03-24 00:00:00 2
注意:如果您在同一日期有值,那么它們將按順序系結并始終聚合在一起(即第 2 行和第 3 行)。如果您希望將它們單獨聚合,那么您需要通過其他方式訂購以打破聯系,但這不適用于RANGE視窗。
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/354050.html
