鉴于下表结构
CustomerID | Balance | Date
1 | 100.00 | 07-09-2016
1 | -50.00 | 08-09-2016
1 | -60.00 | 09-09-2016
1 | 500.00 | 10-09-2016
1 | 600.00 | 11-09-2016
1 | -100.00 | 12-09-2016
1 | -200.00 | 13-09-2016
1 | -400.00 | 14-09-2016
1 | -500.00 | 15-09-2016
Run Code Online (Sandbox Code Playgroud)
我想从底部开始并选择所有具有负余额的行,并在找到贷方余额后停止。对于上面的示例数据,我希望结果如下
1 | -100.00 | 12-09-2016
1 | -200.00 | 13-09-2016
1 | -400.00 | 14-09-2016
1 | -500.00 | 15-09-2016
Run Code Online (Sandbox Code Playgroud)
我如何实现这一目标?
谢谢。
最简单的方法是使用NO EXISTS. 如果没有其他较晚日期的行具有正余额,则返回一行:
select *
from tablename t1
where not exists (select * from tablename t2
where t2.Balance > 0
and t2.date > t1.date)
Run Code Online (Sandbox Code Playgroud)
或者,让子查询返回余额 > 0 的最新日期:
select *
from tablename
where date > (select max(date) from tablename where balance > 0)
Run Code Online (Sandbox Code Playgroud)