sqlserver 数据区间补全

数字补全

declare @tb table (id int)
insert into @tb
select 10
union
select 100
union
select 1000

select id,nn,(case when id=nn then '存在' else '补全' end) 
from @tb a
cross apply(
	select number+isnull((select top 1 id from @tb where id<a.id order by id desc),0)+1 as nn
	from master..spt_values where type='p'
	and number<a.id-isnull((select top 1 id from @tb where id<a.id order by id desc),0)
) c
order by nn

使用 master..spt_values 常量表进行数字补全,需要注意的是spt_values中数字常量从0到2047,超过这个范围的数字是跳跃的,不再是连续的数字了,需要其他方式进行补全


日期补全

declare @tb table(dt date)
insert into @tb
select '2015-1-1'
union
select '2016-4-4'

select *,(case when dt=nn then '存在' else '补全' end) 
from @tb a
cross apply(
	select number,dateadd(d,-number,a.dt) as nn
	from master..spt_values where type='p'
	and number<datediff(d,isnull((select top 1 dt from @tb where dt<a.dt order by dt desc),dateadd(d,-1,a.dt)),a.dt)
) c
order by nn


日期补全的原理与数字补全一样,不过是使用日期差方式进行计算,然后使用dateadd来生成补全的日期,我这里使用的是后边的日期补全前边的日期,也可以调整成如果存在当前行日期后的日期补后边日期

猜你喜欢

转载自blog.csdn.net/superwfei/article/details/78200513