首页 > 解决方案 > 从可变起点线性外推值到 0

问题描述

我想构建一个查询,它允许我从最后一个已知值开始灵活地线性推断一个数字到年龄 0。该表(见下文)有两列,即 Age 列和 Volume 列。我最后一次知道的成交量是 11 岁时的 321.60,我怎样才能以每年的步骤将 321.60 线性推断到 0 岁?另外,我想以允许年龄改变的方式设计查询。例如,在另一种情况下,最后一卷是在 27 岁时。我一直在尝试使用前导函数,结果我可以推断 10 岁时的音量,但该函数不允许我推断到 0。我怎么能设计一个查询,它 (A) 允许我线性外推到年龄 0,并且 (B) 是灵活的并且允许线性外推的不同起点。

SELECT     [age], 
           [volume], 
           Concat(CASE WHEN volume IS NULL THEN ( Lead(volume, 1, 0) OVER (ORDER BY age) ) / ( age + 1 ) * 
           age END, volume) AS 'Extrapolate' 
    FROM   tbl_volume

+-----+--------+-------------+
| Age | Volume | Extrapolate |
+-----+--------+-------------+
|   0 | NULL   | NULL        |
|   1 | NULL   | NULL        |
|   2 | NULL   | NULL        |
|   3 | NULL   | NULL        |
|   4 | NULL   | NULL        |
|   5 | NULL   | NULL        |
|   6 | NULL   | NULL        |
|   7 | NULL   | NULL        |
|   8 | NULL   | NULL        |
|   9 | NULL   | NULL        |
|  10 | NULL   | 292.363     |
|  11 | 321.60 | 321.60      |
|  12 | 329.80 | 329.80      |
|  13 | 337.16 | 337.16      |
|  13 | 343.96 | 343.96      |
|  14 | 349.74 | 349.74      |
+-----+--------+-------------+

标签: sqlsql-serverstatisticsextrapolation

解决方案


如果我假设该值为0at 0,那么您可以使用简单的算术。这似乎适用于您的情况:

select t.*,
       coalesce(t.volume, t.age * (t2.volume / t2.age)) as extrapolated_volume
from t cross join
     (select top (1) t2.*
      from t t2
      where t2.volume is not null
      order by t2.age asc
     ) t2;

是一个 db<>fiddle


推荐阅读