您可以通过创建一个周期表以相对简单的方式执行此操作,您可以将其与帐户表连接以在每个帐户每个周期创建一行。
这是一个例子。让我们设置一些临时表:
create table #balance (
id int identity,
balance float,
date datetime,
aid int
)
create table #period (
id int identity,
startdt datetime,
enddt datetime
)
输入一些测试数据:
insert into #yourtable (balance, date, aid) values (4,'2009-01-01',1)
insert into #yourtable (balance, date, aid) values (5,'2009-01-10',1)
insert into #yourtable (balance, date, aid) values (6,'2009-01-10',1)
insert into #yourtable (balance, date, aid) values (7,'2009-01-16',1)
insert into #yourtable (balance, date, aid) values (2,'2009-01-01',2)
insert into #yourtable (balance, date, aid) values (3,'2009-01-10',2)
insert into #yourtable (balance, date, aid) values (4,'2009-01-10',2)
insert into #yourtable (balance, date, aid) values (5,'2009-01-16',2)
insert into #period (startdt, enddt) values ('2009-01-01','2009-01-06')
insert into #period (startdt, enddt) values ('2009-01-06','2009-01-11')
insert into #period (startdt, enddt) values ('2009-01-11','2009-01-16')
insert into #period (startdt, enddt) values ('2009-01-16','2009-01-21')
现在让我们查询所有时期:
from #period p
在期末前为每个余额添加一行:
left join #balance b1 on
b1.date <= p.enddt
在第一次加入的余额和期末之间搜索余额:
left join #balance b2 on
b2.aid = b1.aid
and b1.id < b2.id
and b2.date <= p.enddt
然后过滤掉不是其期间最后余额的行。
where
b2.aid is null
b2 连接基本上寻找“中间”值,并且通过说它的 id 为空,你说不存在中间行。最终查询如下所示:
select
b1.aid
, p.startdt
, b1.balance
from #period p
left join #balance b1 on
b1.date <= p.enddt
left join #balance b2 on
b2.aid = b1.aid
and b1.id < b2.id
and b2.date <= p.enddt
where
b2.aid is null
order by b1.aid, p.startdt
注意:查询假设余额与较晚的日期总是有较大的 id。如果您不必使用完全相同的结束日期进行余额,则可以将“b1.id < b2.id”替换为“b1.date < b2.date”。