线性外推值从变量起点向下到0

6ovsh4lw  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(327)

我想建立一个查询,允许我灵活的线性外推一个数字,从最后一个已知值开始,一直到0岁。该表(见下文)有两列,列年龄和体积。我最后一次知道的量是321.60在11岁的时候,我怎么能把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      |
+-----+--------+-------------+
ukdjmx9f

ukdjmx9f1#

如果我假设这个值是 00 ,则可以使用简单的算法。这似乎适用于您的情况:

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;

这是一把小提琴

enxuqcxy

enxuqcxy2#

你可以使用一个空窗口函数 over() 为了这种事。举个简单的例子:

create table t(j int, k decimal(3,2));
insert t values (1, null), (2, null), (3, 3), (4, 4);

select  j, j * avg(k / j) over ()       
from    t

请注意 avg() 忽略空值。

相关问题