sql - 从可变起点线性外推值到 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
at 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
推荐阅读
- javascript - 如何正确覆盖localStorage中的缓存数据
- c# - 增加从 Excel 工作表转换为 HTML 时包含的行范围
- javascript - 拒绝连接到“wss://live.mysite.com:3000/”,因为它违反了以下内容安全策略指令:
- javascript - 如何使用 Firebase 存储更改 Node.js 中图像的路径?
- c - Git Bash“致命错误:stdio.h:没有这样的文件或目录”
- php - 如何通过数据透视表展示相关产品?
- html - 当页面向下滚动时,如何获得一个不溢出的div来填充整个高度?
- haskell - Haskell:如何在 do 块下使用 where 语句
- javascript - 错误:验证失败:需要路径
- python - 如何在我的 flask-sqlalchemy 应用程序中使用 Heroku Postgres?