日期:2014-05-17  浏览次数:20442 次

有规律的数据中如何查找偶尔丢失的数据!
--表结构
table(id,tm,myValue)
--数据
value(1,'2012-8-27 20:00:00',1)
value(1,'2012-8-27 21:00:00',1)
value(1,'2012-8-27 22:00:00',1)
value(1,'2012-8-27 23:00:00',1)
value(1,'2012-8-28 00:00:00',1)
value(1,'2012-8-28 01:00:00',1)
value(1,'2012-8-28 02:00:00',1)
value(1,'2012-8-28 03:00:00',1)
value(1,'2012-8-28 04:00:00',1)
value(1,'2012-8-28 05:00:00',1)
value(1,'2012-8-28 06:00:00',1)
...
...

假如划横线的那条数据丢失,如何在List<T>里面知道这条数据已丢失,丢失以后把该条数据补上去,myValue可以为0

或这有好的办法在sql查询的时候就知道丢失了哪些数据(好像这方法不靠谱)。

------解决方案--------------------
可以用临时表实现,
思路如下:
先使用rownum生成你的那些标准的数据,写入临时表。
然后,再查询你的表中不存在于临时表里的数据,这样就可以了。

可以写为存储过程来实现。
------解决方案--------------------

create table test1 (id int,tm datetime,myValue int) 

insert into test1 
values(1,'2012-8-27 20:00:00',1),
(1,'2012-8-27 21:00:00',1),
(1,'2012-8-27 22:00:00',1),
(1,'2012-8-27 23:00:00',1),--Missing 2012-08-28 00:00:00.000
(1,'2012-8-28 01:00:00',1),
(1,'2012-8-28 02:00:00',1),
(1,'2012-8-28 03:00:00',1),--Missing 2012-08-28 04:00:00.000
(1,'2012-8-28 05:00:00',1),
(1,'2012-8-28 06:00:00',1)

;with tmp as 
(
select row_number()OVER (order by tm asc) as Num,---排除最小的TM
id,
DATEADD(HOUR,-1,tm) as tm,
myValue 
from test1 t1 where not exists 
(select tm from test1 t2 where DATEADD(HOUR,1,t2.tm) = t1.tm )
)

insert into test1 
select id,tm,myValue from tmp where Num > 1


select * from test1 order by tm asc 

 
 id tm myValue
----------- ----------------------- -----------
1 2012-08-27 20:00:00.000 1
1 2012-08-27 21:00:00.000 1
1 2012-08-27 22:00:00.000 1
1 2012-08-27 23:00:00.000 1
1 2012-08-28 00:00:00.000 1
1 2012-08-28 01:00:00.000 1
1 2012-08-28 02:00:00.000 1
1 2012-08-28 03:00:00.000 1
1 2012-08-28 04:00:00.000 1
1 2012-08-28 05:00:00.000 1
1 2012-08-28 06:00:00.000 1

(11 row(s) affected)