假设我有一个名为 transaction 的表,其中包含 transaction_date、存款、取款字段。一天可能有也可能没有交易,但每天可以有多个交易。所以,我需要做的是给定一个日期范围,比如 2010 年 12 月 1 日到 2010 年 12 月 31 日,我需要计算出每天的最低余额。假设在 2010 年 12 月 1 日之前也有交易。有没有人可以给我一个想法?

谢谢你。

使用示例更新

 tran_date   withdraw    deposit
2010-11-23       0.00      50.00
2010-12-10       0.00      50.00
2010-12-10       0.00     200.00
2010-12-12     100.00       0.00
2010-12-20       0.00      50.00
2010-12-20      70.00       0.00
2010-12-20       0.00      50.00
2010-12-20       0.00      50.00
2010-12-24     150.00       0.00

在上面的示例中,从 12 月 1 日到 12 月 10 日的最低每日余额将为 50 。 12 月 10 日有两笔存款,总计 70 ,但当天的最低余额为 50 (从前一天结转)。

现在让我们看看多笔交易。

12 月 20 日结转的是 200 。第一次存款是 250 ,第二笔是 180 ,第三笔是 230 ,最后一笔交易是 280 。因此,在当天的第二笔交易中提取 70 后,当天的最低余额将是 180 。是否可以使用 PostgreSQL 8.4 上的查询来生成它,还是应该使用另一种方法?

最佳答案

Edit2
这是一个完整的例子,包括前一天的(最低)余额(据我所知,用这么小的数据集)。它应该在 8.4 上运行。

我重构了派生表以使用 CTE(通用表表达式)使其(希望)更具可读性:

天 AS (
-- 生成可能跨越的日期列表
-- 整个交易间隔
SELECT min(tran_date) + generate_series(0, max(tran_date) - min(tran_date)) AS some_date
从交易
),
total_balance AS (
-- 计算所有交易的运行总计
选择 tran_id,
days.some_date 作为 tran_date,
订金,
退出,
总和(存款 - 取款)
OVER (ORDER BY some_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) 作为余额
从天
左连接事务 t ON t.tran_date = days.some_date
),
min_balance AS (
-- 计算每天的最低余额
-- (smalles balance 在 balance_rank 列中有一个“1”)
选择 tran_id,
转日期,
rank() OVER (PARTITION BY tran_date ORDER BY balance) 作为 balance_rank,
平衡
FROM total_balance
)
-- 现在获取一切,包括前一天的余额
选择 tran_id,
转日期,
平衡,
滞后(余额)超过(按 tran_date 排序)作为 previous_balance
从 min_balance
WHERE balance_rank = 1;

关于java - 计算每日最低余额,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4568521/

10-13 03:36