Интерполировать отсутствующие значения в SQL Server 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.


person user2239073    schedule 15.04.2013    source источник
comment
Оформление заказа: stackoverflow .com/questions/6569376/   -  person Hans    schedule 15.04.2013


Ответы (2)


Вы можете оценить недостающие значения, используя метод простой линейной регрессии, см. "численный пример".

person polkduran    schedule 15.04.2013
comment
Как это возможно в SQL Server 2012 - person user2239073; 15.04.2013
comment
Я не думаю, что в SQL Server есть собственный или встроенный метод для этого. - person polkduran; 15.04.2013
comment
Вы можете увидеть несколько примеров, чтобы вдохновить вас. stackoverflow.com/questions/6569376 / - person polkduran; 15.04.2013
comment
Я очень новичок в SQl Server. Не могли бы вы создать для меня прототип. - person user2239073; 15.04.2013
comment
Это решение, похоже, ничего не дает. - person Hack-R; 05.11.2015

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

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*x+@a
where y is null

select * from @alo
person polkduran    schedule 15.04.2013
comment
Спасибо за ответ. Но это кажется неверным, так как Null заменяется на 38,50 и 62, но на самом деле его следует заменить на 22,5, 25 и 27,5. - person user2239073; 16.04.2013
comment
Действительно, было две ошибки: одна в данных, а другая в коэффициентах линейной функции. Я перевернул их, нужно читать y = @b*x+@a, я отредактировал ответ - person polkduran; 16.04.2013
comment
Я также установил @alo.y как float, чтобы иметь более точные значения, результат: (1,10),(2,20),(3,19,99),(4,23,57),(5,27,14),( 6,30) вы не получите того, что ожидали, потому что это метод оценки. Если вы удалите первое значение в своих данных (1,10), теперь у вас будет то, что вы ожидали, потому что вы будете интерполировать между двумя значениями, а не оценкой линейной регрессии. - person polkduran; 16.04.2013