从可变起点线性外推值至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      |
+-----+--------+-------------+

如果我假设0处的值是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<gt;小提琴

对于这种事情,可以使用带有空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()忽略null。

相关内容

  • 没有找到相关文章

最新更新