作为子查询的替代方法,您可以使用运行总计查询。这是我为这种情况设置的方法。首先创建一些测试数据:
create table #payments (
paymentid int identity,
customerid int,
paymentdate datetime,
amount decimal
)
insert into #payments (customerid,paymentdate,amount) values (1,'2009-01-01',1.00)
insert into #payments (customerid,paymentdate,amount) values (1,'2009-01-02',2.00)
insert into #payments (customerid,paymentdate,amount) values (1,'2009-01-03',-1.00)
insert into #payments (customerid,paymentdate,amount) values (1,'2009-01-04',2.00)
insert into #payments (customerid,paymentdate,amount) values (1,'2009-01-05',-3.00)
insert into #payments (customerid,paymentdate,amount) values (2,'2009-01-01',10.00)
insert into #payments (customerid,paymentdate,amount) values (2,'2009-01-02',-5.00)
insert into #payments (customerid,paymentdate,amount) values (2,'2009-01-03',7.00)
现在您可以执行运行总计查询,计算每个客户在每次付款后的余额:
select cur.customerid, cur.paymentdate, sum(prev.amount)
from #payments cur
inner join #payments prev
on cur.customerid = prev.customerid
and cur.paymentdate >= prev.paymentdate
group by cur.customerid, cur.paymentdate
这会生成数据:
Customer Paymentdate Balance after payment
1 2009.01.01 1
1 2009.01.02 3
1 2009.01.03 2
1 2009.01.04 4
1 2009.01.05 1
2 2009.01.01 10
2 2009.01.02 5
2 2009.01.03 12
要查看最大值,您可以对正在运行的总查询进行分组:
select customerid, max(balance)
from (
select cur.customerid, cur.paymentdate, balance = sum(prev.amount)
from #payments cur
inner join #payments prev
on cur.customerid = prev.customerid
and cur.paymentdate >= prev.paymentdate
group by cur.customerid, cur.paymentdate
) runningtotal
group by customerid
这给出了:
Customer Max balance
1 4
2 12
希望这是有用的。