我有一个表格,其中包含每个 ID 的每月金额,其中某些月份会开具发票。
我的桌子看起来像:
身份证 | 日期 | 已开发票 | 金额 |
---|---|---|---|
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 的行和发票月份,其中我们将自上次发票以来的先前金额相加。 我想要拥有什么:
身份证 | 日期 | 已开发票 | 金额 |
---|---|---|---|
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
我们可以使用
LAG()
和 SUM()
的组合作为窗口函数,为每个发票周期、每个 ID
创建一个伪组:
WITH cte1 AS (
SELECT *, LAG(Invoiced) OVER (PARTITION BY ID ORDER BY Date) LagInvoiced
FROM yourTable
),
cte2 AS (
SELECT *, SUM(LagInvoiced) OVER (PARTITION BY ID ORDER BY Date) grp
FROM cte1
)
SELECT
ID,
MAX(CASE WHEN Invoiced = 1 THEN Date END) AS InvDate,
1 AS Invoiced,
SUM(Amount)
FROM cte2
GROUP BY
ID,
grp
ORDER BY
ID,
InvDate;