Oracle SQL:如何对每行的每x个后续行求和

问题描述

我有一个看起来像这样的数据表:

|Contract Date | Settlement_Prcie |
|--------------|------------------|
| 01/10/2020   |         50       |
|--------------|------------------|
| 01/11/2020   |         10       |
|--------------|------------------|
| 01/01/2021   |         20       |
|--------------|------------------|
| 01/02/2021   |         30       |
|--------------|------------------|
| 01/03/2021   |         50       |
|--------------|------------------|

我想编写一个查询,对下面的每两行进行求和...例如,在合同日期为01/10/2020的第一行上,sum列将加10和20得出结果30。下一行,求和列将加20和30,得到40,依此类推。结果表如下:

|Contract Date | Settlement_Prcie | Sum Column |
|--------------|------------------|------------|
| 01/10/2020   |         50       |     30
|--------------|------------------|------------|
| 01/11/2020   |         10       |     50
|--------------|------------------|------------|
| 01/01/2021   |         20       |     80
|--------------|------------------|------------|
| 01/02/2021   |         30       |
|--------------|------------------|
| 01/03/2021   |         50       |
|--------------|------------------|

任何人都可以帮助我进行查询,不仅针对连续2行,而且针对连续x行。

到目前为止,我尝试使用SUM (Settlement_Price) Over (order by Contract_date Rows between 3 preceding and current row) - Current row当然还不行,但是就我所知。

解决方法

SUM (Settlement_Price) Over (order by Contract_date Rows between 1 following and 2 following)
,

您可以使用SUM分析函数:

SELECT contract_date,settlement_price,CASE COUNT(*) OVER (
              ORDER BY contract_date ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
            )
       WHEN 2
       THEN SUM( settlement_price ) OVER (
              ORDER BY contract_date ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING
            )
       END AS sum_column
FROM   table_name;

或者您可以使用LEAD

SELECT contract_date,LEAD( settlement_price,1,NULL ) OVER ( ORDER BY contract_date )
         + LEAD( settlement_price,2,NULL ) OVER ( ORDER BY contract_date )
         AS sum_column
FROM   table_name;

因此,对于测试数据:

CREATE TABLE table_name ( contract_date,settlement_price ) AS
SELECT DATE '2020-10-01',50 FROM DUAL UNION ALL
SELECT DATE '2020-11-01',10 FROM DUAL UNION ALL
SELECT DATE '2020-12-01',20 FROM DUAL UNION ALL
SELECT DATE '2021-01-01',30 FROM DUAL UNION ALL
SELECT DATE '2021-02-01',50 FROM DUAL;

两个查询输出:

CONTRACT_DATE | SETTLEMENT_PRICE | SUM_COLUMN
:------------ | ---------------: | ---------:
01-OCT-20     |               50 |         30
01-NOV-20     |               10 |         50
01-DEC-20     |               20 |         80
01-JAN-21     |               30 |       null
01-FEB-21     |               50 |       null

db 提琴here