交易表中的历史余额

Posted

技术标签:

【中文标题】交易表中的历史余额【英文标题】:Historical Balance from a transactaion table 【发布时间】:2021-07-08 11:41:24 【问题描述】:

我有下表:

customer_id transacting date day_end_balance
523161 7/2/2021 136.2
523161 6/14/2021 215.4
523161 6/7/2021 0
523161 6/2/2021 440

所以余额会在交易发生时显示,如果没有交易发生,余额在一天结束时保持不变。我想创建一个表格,显示从客户生命之初到今天每个客户的日终余额。检查下表以获得所需的输出。

customer_id transacting date day_end_balance
523161 6/2/2021 440
523161 6/3/2021 440
...... ............ .....
523161 6/7/2021 0
523161 6/8/2021 0
523161 6/9/2021 0
523161 6/10/2021 0
523161 6/11/2021 0
523161 6/12/2021 0
523161 6/13/2021 0
523161 6/14/2021 215.4
523161 6/14/2021 215.4
523161 6/15/2021 215.4
523161 6/16/2021 215.4
523161 6/17/2021 215.4
523161 6/18/2021 215.4
523161 6/19/2021 215.4
523161 6/20/2021 215.4
523161 6/21/2021 215.4
523161 6/22/2021 215.4
523161 6/23/2021 215.4
523161 6/24/2021 215.4
523161 6/25/2021 215.4
523161 6/26/2021 215.4
523161 6/27/2021 215.4
523161 6/28/2021 215.4
523161 6/29/2021 215.4
523161 6/30/2021 215.4
523161 7/1/2021 215.4
523161 7/2/2021 136.2
523161 .... 136.2
523161 date of today 136.2

我如何在 postgres sql 中执行此操作?我知道它会涉及 last_value() 和 coalesce(),可能还有 lag() 和 lead()。但是不知道怎么写。

【问题讨论】:

【参考方案1】:

您可以使用generate_series() 获取客户的最短日期和今天之间的所有天数,并横向连接选择小于或等于系列中相应日期的最长日期的数据。

SELECT cjl."customer_id",
       gs."transacting date",
       cjl."day_end_balance"
       FROM generate_series((SELECT min(t."transacting date")
                                    FROM elbat t
                                    WHERE t."customer_id" = 523161),
                            current_date,
                            '1 day'::interval) gs
                                               ("transacting date")
            CROSS JOIN LATERAL (SELECT t."customer_id",
                                       t."day_end_balance"
                                       FROM elbat t
                                       WHERE t."customer_id" = 523161
                                             AND t."transacting date" <= gs."transacting date"
                                       ORDER BY t."transacting date" DESC
                                       LIMIT 1) cjl
       ORDER BY gs."transacting date";

【讨论】:

以上是关于交易表中的历史余额的主要内容,如果未能解决你的问题,请参考以下文章

余额为负3个月

SQL窗口函数和运行总计

如何在 Google Cloud Datastore 上更新交易中的帐户余额

如何查询余额历史

区块链鼻祖比特币之4:独特交易设计

根据 postgresQL 中的时间戳将值从一个表映射到另一个表