从 SQL/Oracle 中的给定当前日期计算 90 个日历日期(回顾)的总和
**Calender_Date** **Customer_ID** **Amount**
01-Jan-21 20211003 59
01-Jan-21 20211005 100
27-Jan-21 20211003 25
25-Feb-21 20211003 188
23-Mar-21 20211005 67
24-Apr-21 20211009 43
25-May-21 20211013 21
26-May-21 20211013 89
11-Jul-21 20211009 65
28-Aug-21 20211003 90
需要:考虑 Customer_ID - 滚动总和超过 90 日历回顾日期(从每个给定的当前日期)。
输出要求或期望的结果
**Calender_Date** **Customer_ID** **Amount** **SumofLookbackRolling90DayAmount**
1-Jan-21 20211003 59 59
1-Jan-21 20211005 100 100
27-Jan-21 20211003 25 84
25-Feb-21 20211003 188 272
23-Mar-21 20211005 67 167
24-Apr-21 20211009 43 43
25-May-21 20211013 21 21
26-May-21 20211013 89 110
11-Jul-21 20211009 65 108
28-Aug-21 20211003 90 90
回答
您可以使用带有范围窗口的解析函数:
SELECT t.*,
SUM(amount) OVER (
PARTITION BY customer_id
ORDER BY calendar_date
RANGE BETWEEN INTERVAL '90' DAY PRECEDING
AND INTERVAL '0' DAY FOLLOWING
) AS rolling_sum
FROM table_name t
其中,对于您的示例数据:
SELECT t.*,
SUM(amount) OVER (
PARTITION BY customer_id
ORDER BY calendar_date
RANGE BETWEEN INTERVAL '90' DAY PRECEDING
AND INTERVAL '0' DAY FOLLOWING
) AS rolling_sum
FROM table_name t
输出:
CALENDAR_DATE 顾客ID 数量 ROLLING_SUM 01-JAN-21 20211003 59 59 21 年 1 月 27 日 20211003 25 84 25-FEB-21 20211003 188 272 28 年 8 月 21 日 20211003 90 90 01-JAN-21 20211005 100 100 21 年 3 月 23 日 20211005 67 167 24-APR-21 20211009 43 43 21 年 7 月 11 日 20211009 65 108 21 年 5 月 25 日 20211013 21 21 21 年 5 月 26 日 20211013 89 110
db<>在这里摆弄
THE END
二维码