我有一个表,每个ID的每月金额,其中一些月的发票发生.

我的桌子看起来像:

ID Date Invoiced Amount
AAA 2023-01 0 10
AAA 2023-02 0 15
AAA 2023-03 1 15
AAA 2023-04 0 10
AAA 2023-05 0 10
AAA 2023-06 1 10
BBB 2022-05 0 40
BBB 2022-06 1 20
BBB 2022-07 0 30
BBB 2022-08 1 30

我只需要每个ID的行与发票月份,在那里,我们的总和超过以前的金额自上次发票. 我想要的是:

ID Date Invoiced Amount
AAA 2023-03 1 40
AAA 2023-06 1 30
BBB 2022-06 1 60
BBB 2022-08 1 60

如何在postgresql中实现这一点?我从下面的查询开始,但它还没有给出我需要的.

SELECT "ID", "Date", "Invoiced"
      , sum(Amount) OVER (PARTITION BY "Invoiced" ORDER BY "Id", "Date") AS Amount
FROM   Table

推荐答案

你有一个gaps and islands的问题,你可以使用SUM()作为窗口函数,以降序排列,给每一个连续的行组一个唯一的id(0值然后1):

WITH cte AS (
  SELECT *, sum(invoiced) OVER (PARTITION BY ID ORDER BY Date desc) grp
  FROM mytable
  ORDER BY ID, Date
)
SELECT ID, MAX(date) AS Date, MAX(Invoiced) AS Invoiced, SUM(Amount) AS Amount
FROM cte
GROUP BY ID, grp
ORDER BY ID, Date

Sql相关问答推荐

Microsoft Access UNION将长文本字段限制为255个字符

为什么Postgrs Planner会在输出部分中显示我在查询中不使用的列?'""

为什么TRY_CONVERT返回一个XML验证错误而不是NULL?

在SQL中返回缺省值,即使查询不返回任何结果

NULL-生成的列中连接的字符串的输入

按日期时间(不包括秒)连接表

带上最后日期(结果)

用于从第二个表中提取具有最小最终价格值的记录的SQL查询

我需要一个regexp_like来只验证字母D或T、数字和管道

每个学校 Select N个最新的行,但跳过同一学生的重复行

显示十进制列,但尽可能显示为整数

每个分组最多 Select 最后 2 个值并并排显示它们

Postgresql - 如何根据阈值计算累积和

避免在SQL中使用具有相同条件的多个子查询

如何从一张表中获取值在至少三行相同的记录

SQL:无重复项的两个聚合函数

Snowflake中的动态SQL优化

使用 SAVE TRANSACTION 时 BEGIN 和 COMMIT 语句的数量不匹配

如何在 Oracle 中获取此变量的值?

如何在 SQL Server 中参数化 Select top 'n'