我有一张这样的表:

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 nullslag() 上的 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/

10-09 05:17