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

Posted

技术标签:

【中文标题】Oracle SQL:如何对每行的每 x 个后续行求和【英文标题】:Oracle SQL: How can I sum every x number of subsequent rows for each row 【发布时间】:2020-10-05 23:21:35 【问题描述】:

我有一个如下所示的数据表:

|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 的第一行,求和列将添加 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,当然不行,但我已经做到了。

【问题讨论】:

LAG()一起使用窗口函数 *** 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :) 【参考方案1】:

可以使用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,
       settlement_price,
       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;

两个查询输出:

合同日期 |结算价格 | SUM_COLUMN :------------ | ---------------: | ---------: 01-OCT-20 | 50 | 30 20 年 11 月 1 日 | 10 | 50 20 年 12 月 1 日 | 20 | 80 21 年 1 月 1 日 | 30 | 01-FEB-21 | 50 |

db小提琴here

【讨论】:

太棒了,我明白这一点,而且效果很好,非常感谢,我被困了好几个小时!【参考方案2】:
SUM (Settlement_Price) Over (order by Contract_date Rows between 1 following and 2 following)

【讨论】:

以上是关于Oracle SQL:如何对每行的每 x 个后续行求和的主要内容,如果未能解决你的问题,请参考以下文章

使用每行的按钮从数据视图中删除行

Postgres - 如何对窗口函数列的每 x 行求和?

如何捕获分组中的第一行以及每行至少相隔 15 天的后续行?

如何使用 jquery 重复 x 行,每行 3 列?

Oracle pl/sql 从物理目录中读取文件的内容

Oracle SQL - 重复行并更新表中的列