【发布时间】:2017-09-28 22:44:16
【问题描述】:
CDC 增长图表数据集提供了一个很好的例子来说明我正在努力完成的工作: http://www.cdc.gov/growthcharts/html_charts/statage.htm
假设他们的表格已经被转换成以下形式:
包含列的cdc 表:chart_label、sex、age、tau、value
with tmp (chart_label, sex, age, tau, val) as (values
('bmi for age','F',2,0.03,14.14735),
('bmi for age','F',2,0.05,14.39787),
('bmi for age','F',2,0.1,14.80134),
('bmi for age','F',2,0.25,15.52808),
('bmi for age','F',2,0.5,16.4234),
('bmi for age','F',2,0.75,17.42746),
('bmi for age','F',2,0.85,18.01821),
('bmi for age','F',2,0.9,18.44139),
('bmi for age','F',2,0.95,19.10624),
('bmi for age','F',2,0.97,19.56411),
('bmi for age','F',2.041667,0.03,14.13226),
('bmi for age','F',2.041667,0.05,14.38019),
('bmi for age','F',2.041667,0.1,14.77965),
('bmi for age','F',2.041667,0.25,15.49976),
('bmi for age','F',2.041667,0.5,16.38804),
('bmi for age','F',2.041667,0.75,17.38582),
('bmi for age','F',2.041667,0.85,17.97371),
('bmi for age','F',2.041667,0.9,18.39526),
('bmi for age','F',2.041667,0.95,19.05824),
('bmi for age','F',2.041667,0.97,19.51534))
select * from tmp;
我想编写一个 PostgreSQL 函数来返回给定图表、性别、年龄和值的估计 tau,如果没有可用于输入的确切值,则使用线性插值来估计 tau。
例如(伪代码):
select interp('bmi for age', 'F', 2.02, 15);
应该返回 0.1 到 0.25(大约 0.141)之间的 tau 值,因为它将在这两行之间进行插值:
('bmi for age','F',2,0.1,14.80134),
('bmi for age','F',2,0.25,15.52808),
我确实意识到线性插值可能不是找到适当百分位数的理想解决方案,但正如我所说,CDC 增长图表是我实际用例的适当近似值。
【问题讨论】:
标签: sql postgresql interpolation linear-interpolation