【问题标题】:Finding the minimum balance given a time frame在给定的时间范围内找到最小余额
【发布时间】:2011-05-24 11:09:00
【问题描述】:

在给定时间范围内计算最低余额的最佳方法是什么?在我的数据库中,我有一个存款列、一个提款列和完成它们的日期列。

更新

假设在1/1,余额为300。在1/2,存入300,总共600。在1/15,提取200,余额为400。在1/25,进一步提取300完成后余额下降到 100。在 1/28,存入 800,余额总计为 900。如果我在 1/31 计算当月的最低余额,我应该得到 100。有什么想法吗?

【问题讨论】:

  • 我不确定您的问题是否可以回答。如果您没有很快得到一个体面的答案,您可能需要提供一些更重要的细节。
  • 至少你正在使用哪个数据库
  • 给定指定时间段内的多次存款和取款,如何确定该时间段内的最低余额,每天计算?
  • 我已经更新了这个问题。我希望现在更清楚了。
  • @justinhj :: 目前我正在使用 PostgreSQL 8.4。

标签: java database postgresql


【解决方案1】:

使用窗口函数建立运行平衡,然后从每个时间间隔中提取最小值,如下所示:

with cte_transaction_data as
(
    select 300 as deposit, null as withdraw, date '01/02/2010' as transaction_date union all
    select null, 200, date '01/15/2010' union all
    select null, 300, date '01/25/2010' union all
    select 800, null, date '01/28/2010'
)
select
    month,
    min(balance) as minimum_balance
from
    (
        select 
            transaction_date,
            date_trunc('month', transaction_date) as month,
            300 
            + coalesce(sum(deposit) over(order by transaction_date rows between unbounded preceding and current row), 0)
            - coalesce(sum(withdraw) over(order by transaction_date rows between unbounded preceding and current row), 0) as balance
         from cte_transaction_data
    ) as running_balance
group by
    month
order by
    month

结果:

month                   minimum_balance
2010-01-01 00:00:00-06  100

【讨论】:

  • 我的朋友竖起大拇指。看起来这现在对我有用。谢谢。
  • :顺便问一下,UNBOUNDED PRECEDING 和 UNBOUNDED FOLLOWING 是做什么的?
  • 它们设置了分区内其他行的范围(在这种情况下是所有行),这些行应该在窗口函数中考虑(在这种情况下是总和)。所以在这种情况下,sum 是按交易日期排序时第一行和当前行之间所有行的运行总和。
【解决方案2】:

循环浏览数据库中每天有存款/取款的每个条目,并将最低数字存储在变量中。如果检查日期的数字较低,则将变量替换为该数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多