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

大数据寻找缺失数据并插值效率问题
本帖最后由 yyj5868800 于 2013-03-07 15:45:05 编辑
已知数据为
ID,TIME,V
610818240010603 2010-03-01 00:00:20.000 1
610818240010603 2010-03-01 00:00:40.000 2
610818240010603 2010-03-01 00:01:00.000 0
610818240010603 2010-03-01 00:01:20.000 0
610818240010603 2010-03-01 00:01:40.000 1
610818240010603 2010-03-01 00:02:00.000 2
610818240010603 2010-03-01 00:02:20.000 1
610818240010603 2010-03-01 00:02:40.000 1
610818240010603 2010-03-01 00:03:00.000 4
610818240010603 2010-03-01 00:03:20.000 2
其中TIME为全天每20s一个数据,现在需要检查所有ID,一天内数据的缺失,对于缺失数据进行插值处理
我现在使用的方法是先编号,然后从头遍历,由于中间还要不断UPDATE编号,效率非常低,数据有2000W,用我的方法太慢,希望能得到大家的指点。谢谢
DECLARE @NUM BIGINT
,@NUM1 BIGINT
,@f1 varchar(50) 
,@f2 varchar(50)
,@d1 datetime
,@d2 datetime
,@v1 int
,@v2 int
SET @NUM =70
SET @NUM1 =70
--遍历
WHILE @NUM1<77
BEGIN
SELECT @d1=TIME,@f1=ID,@v1=V
FROM y1
WHERE NUM=@NUM
SELECT  @d2=TIME,@f2=ID,@v2=V
FROM y1
WHERE NUM=@NUM+1
IF ABS(DATEDIFF(s,@d2,@d1))>20 and @f1=@f2
BEGIN
--更新编号
UPDATE y1
SET NUM=NUM+1 WHERE NUM>@NUM
--插值
INSERT INTO y1 VALUES
(@NUM+1,@f1,DATEADD(s,20,@d1),@v1+(@v2-@v1)/(DATEDIFF(s,@d1,@d2)/20))
END
SET @NUM=@NUM+1
SELECT @NUM1=NUM FROM y1 WHERE NUM=@NUM
END


SQL? 插值 算法效率

------解决方案--------------------
示例数据没有缺失数据吧。。用游标肯定慢。。如果有偿,乐意研究
------解决方案--------------------
先建立一个标准表t20:全天每20s一条记录
你的表tb
from (select distinct id from tb) a ,t20 b 就是完全的记录
再为id都没有的记录插入insert tb select @id,time from t20
 
------解决方案--------------------
2005及以上版本可以用except运算符来找出差异数据。