SQL/ Oracle 中给定当前日期的 90 个日历日期(往回看)的滚动总和

Rolling Sum over 90 Calendar date (look back) from given current date in SQL/ Oracle

**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 个日历回顾日期的滚动总和(从每个给定的当前日期开始)。

OutPut 要求或期望的结果

**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

您可以使用范围为 window:

的解析函数
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

其中,对于您的示例数据:

CREATE TABLE table_name (Calendar_Date, Customer_ID, Amount) AS
SELECT DATE '2021-01-01', 20211003,  59 FROM DUAL UNION ALL
SELECT DATE '2021-01-01', 20211005, 100 FROM DUAL UNION ALL
SELECT DATE '2021-01-27', 20211003,  25 FROM DUAL UNION ALL
SELECT DATE '2021-02-25', 20211003, 188 FROM DUAL UNION ALL
SELECT DATE '2021-03-23', 20211005,  67 FROM DUAL UNION ALL
SELECT DATE '2021-04-24', 20211009,  43 FROM DUAL UNION ALL
SELECT DATE '2021-05-25', 20211013,  21 FROM DUAL UNION ALL
SELECT DATE '2021-05-26', 20211013,  89 FROM DUAL UNION ALL
SELECT DATE '2021-07-11', 20211009,  65 FROM DUAL UNION ALL
SELECT DATE '2021-08-28', 20211003,  90 FROM DUAL;

输出:

CALENDAR_DATE CUSTOMER_ID AMOUNT ROLLING_SUM
01-JAN-21 20211003 59 59
27-JAN-21 20211003 25 84
25-FEB-21 20211003 188 272
28-AUG-21 20211003 90 90
01-JAN-21 20211005 100 100
23-MAR-21 20211005 67 167
24-APR-21 20211009 43 43
11-JUL-21 20211009 65 108
25-MAY-21 20211013 21 21
26-MAY-21 20211013 89 110

db<>fiddle here