我有一张这样的表:
Items Date Price
1 2016-01-01 10
1 2016-01-02 15
1 2016-01-03 null
1 2016-01-04 null
1 2016-01-05 8
1 2016-01-06 null
1 2016-01-07 null
1 2016-01-08 null
2 2016-01-01 14
2 2016-01-02 7
2 2016-01-03 null
2 2016-01-04 null
2 2016-01-05 16
2 2016-01-06 null
2 2016-01-07 null
2 2016-01-08 5
现在我想更新空值。空值前后的价格差必须均匀相加。
例子:
1 2016-01-02 15 to
1 2016-01-05 8
15 到 8 = -7
-7/3 = -2,333333
1 2016-01-02 15
1 2016-01-03 12,6666
1 2016-01-04 10,3333
1 2016-01-05 8
不应该用游标制作。帮助表就可以了。
最佳答案
这确实是您想要 ignore nulls
和 lag()
上的 lead()
选项的地方。唉。
另一种方法是使用 outer apply
:
select t.*,
coalesce(t.price,
tprev.price +
datediff(day, tprev.date, t.date) * (tnext.price - tprev.price) / datediff(day, tprev.date, tnext.date)
) as est_price
from t outer apply
(select top 1 t2.*
from t t2
where t2.item = t.item and
t2.date <= t.date and
t2.price is not null
order by t2.date desc
) tprev outer apply
(select top 1 t2.*
from t t2
where t2.item = t.item and
t2.date >= t.date and
t2.price is not null
order by t2.date asc
) tnext ;
复杂的算术只是计算差值,除以天数,然后将天数分配到当天。
关于sql - 在 t-sql 中流畅地添加值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41513712/