PGSQL:如何根据每个客户按最近的对账单日期查找银行结束日期



我有一个名为"bankStatement"的表,其中我们有bankaccount_idstatement_datebegining_balanceending_balance作为列。我的要求是使用最近的statement_date找到所有bankaccount_id的期末余额。让我们以例如

bankaccount_id  statement_date  begining_balance  ending_balance
--------------  -------------   ----------------  --------------
   101            05-05-16       1500              1000
   101            10-05-16       1000              2000
   101            06-06-16       2000               500

现在我需要将结束余额的 06-06-16 日设为 500,但是当我尝试时

select bankaccount_id,max(statement_date),ending_balance from bankStatement
group by bankaccount_id,ending_balance

由于按ending_balance分组,它提供了所有记录。如何解决这个问题以获得最终的期末余额。所以结果应该是这样的,

bankaccount_id  statement_date  ending_balance
--------------  -------------   ---------------- 
     101            06-06-16        500

在子查询中查找最大对帐单日期,然后获取该帐户和对帐单日期的所有原始信息。

select bs.bankaccount_id,
    bs.statement_date,
    bs.ending_balance 
from bankStatement bs
join (select bankaccount_id, 
          max(statement_date) max_statement_date 
      from bankStatement 
      group by  bankaccount_id) max
    on bs.bankaccount_id=max.bankaccount_id
        and bs.statement_date = max.max_statement_date

您可以使用 Postgres 的不同扩展:

select 
  distinct on (bankaccount_id) 
  bankaccount_id, statement_date, ending_balance 
from 
  bankstatement 
order by 
  bankaccount_id, statement_date desc

在我看来,这种方法比使用 max 进行子选择更优雅、更安全(如果两条记录共享相同的时间戳怎么办?

最新更新