2013-04-15 4 views
0

Я хочу, чтобы интерполировать пропущенные значения и обновить таблицу соответственно в сервере SQL 2012интерполировать Отсутствующие значения в SQL Server 2012

Например мои данные следующим образом:

Week_Number Var1 Output_Var 
1   10   10 
2   20   20 
3   NULL  22.5 
4   NULL  25.0 
5   NULL  27.5 
7   30   30 

Выход var1 должен выглядеть как переменная Output_Var.

+0

заказ: http://stackoverflow.com/questions/6569376/best-way-to-interpolate- values-in-sql? lq = 1 – Hans

ответ

0

Вы можете оценить свои недостающие значения с помощью техники simple linear regression, см. «numerical example».

+0

Как это возможно в SQL Server 2012 – user2239073

+0

Я не думаю, что в SQL Server есть встроенный или встроенный метод. – polkduran

+0

Вы можете увидеть несколько примеров, чтобы вдохновить вас. http://stackoverflow.com/questions/6569376/best-way-to-interpolate-values-in-sql – polkduran

0

Вы могли бы использовать что-то вроде этого (от this):

declare @alo as table(x int, y float); 
insert into @alo (x,y) values 
(1,10), 
(2,20), 
(3,null), 
(4,null), 
(5,null), 
(6,30) 
; 
declare @sumtable as table(sx int ,sy int ,sx2 int,sy2 int ,sxy int, n int); 

insert into @sumtable 
select 
SUM(d.x) as sx, 
SUM(d.y) as sy, 
SUM(d.x2) as sx2, 
SUM(d.y2) as sy2, 
SUM(d.xy) as sxy, 
count(0) as n 
from (

    select 
    x, x*x as x2, 
    y, y*y as y2, 
    x*y as xy 
    from @alo 
    where x is not null and y is not null 
) D 



declare @sx int = (select sx from @sumtable), 
     @sx2 int = (select sx2 from @sumtable), 
     @sy int= (select sy from @sumtable), 
     @sy2 int= (select sy2 from @sumtable), 
     @sxy int= (select sxy from @sumtable), 
     @n int = (select n from @sumtable); 


declare @b as float = cast((@n*@sxy- @sx*@sy) as float)/ cast((@n*@sx2 - @sx*@sx) as float); 
declare @a as float = (1.0/@n)*@sy - @b*(1.0/@n)*@sx; 


update @alo 
set y = @b*[email protected] 
where y is null 

select * from @alo 
+0

Спасибо за ответ. Но это кажется неправильным, поскольку Null заменяют на 38,50 и 62, но на самом деле он должен быть заменен на 22,5, 25 и 27,5. – user2239073

+0

На самом деле было две ошибки: одна - по данным, а другая - по линейным функциям. Я перевернул их, должен прочитать y = @ b * x + @ a, я отредактировал ответ – polkduran

+0

Я также установил @ alo.y как float для получения более точных значений, результат: (1,10), (2,20) , (3,19,99), (4,23,57), (5,27.14), (6,30) у вас не будет того, что вы ожидали, потому что это метод оценки. Если вы удалите первое значение своих данных (1,10), теперь у вас будет то, что вы ожидали, потому что вы будете интерполировать между двумя значениями, а не с оценкой линейной регрессии – polkduran

2
declare @alo as table(x int, y float); 
insert into @alo (x,y) values (1,10); 
insert into @alo (x,y) values (2,20); 
insert into @alo (x,y) values (3,null); 
insert into @alo (x,y) values (4,null); 
insert into @alo (x,y) values (5,null); 
insert into @alo (x,y) values (6,30); 

SELECT this.x as [X], isnull(this.y, 
    (
     SELECT CASE WHEN next.x IS NULL THEN prev.y 
         WHEN prev.x IS NULL THEN next.y 
         WHEN next.x = prev.x THEN prev.y 
         ELSE prev.y + ((next.y - prev.y) * (this.x - prev.x)/(next.x - prev.x)) 
        END 
     FROM 
      (SELECT TOP 1 X, Y FROM @alo WHERE x <= this.x and y is not null ORDER BY x DESC) AS prev 
      CROSS JOIN 
      (SELECT TOP 1 X, Y FROM @alo WHERE x >= this.x and y is not null ORDER BY x ASC) AS next 
     )) as [Y] 
FROM @alo this order by this.x ASC 
Смежные вопросы