基于查找表的SQL线性插值

时间:2012-02-23 13:51:19

标签: sql join linear-interpolation

我需要在SQL查询中构建线性插值,使用包含查找值的连接表(实际上更像是查找阈值)。因为我对SQL脚本相对较新,所以我搜索了一个示例代码,指出我正确的方向,但我遇到的大多数SQL脚本都是在日期和时间戳之间进行插值,我无法将这些与我的情况联系起来。

基本上,我在一个列中有一个包含多行十进制值的主数据表,例如:

Main_Value
0.33
0.12
0.56
0.42
0.1  

现在,我需要根据包含非线性阈值和相关线性标准化值的联接查找表,为上面的每一行生成插值数据点:

Threshold_Level     Normalized_Value
0                            0
0.15                         20
0.45                         40
0.60                         60
0.85                         80
1                           100

因此,例如,如果Main_Value列中的值为0.45,则查询将在最近的Threshold_Level中(或之间)查找其位置,并根据Normalized_Value列中的相邻值对其进行插值(这将产生一个值)在这个例子中为40)。

我真的很感激有关构建SQL查询的任何见解,特别是因为很难使用连接表来追踪任何线性插值的SQL示例。

有人指出我可以使用某种舍入,所以我在下面列出了一个更详细的表格。我希望SQL查询查找每个Main_Value(来自上面的第一个表),它位于下表中的Threshold_Min和Threshold_Max值之间,并返回'Normalized_%'值:

    Threshold_Min   Threshold_Max   Normalized_%
    0.00                0.15             0
    0.15                0.18             5
    0.18                0.22             10
    0.22                0.25             15
    0.25                0.28             20
    0.28                0.32             25
    0.32                0.35             30
    0.35                0.38             35
    0.38                0.42             40
    0.42                0.45             45
    0.45                0.60             50
    0.60                0.63             55
    0.63                0.66             60
    0.66                0.68             65
    0.68                0.71             70
    0.71                0.74             75
    0.74                0.77             80
    0.77                0.79             85
    0.79                0.82             90
    0.82                0.85             95
    0.85                1.00             100

例如,如果Main_Value表中的值为0.52,则它介于Threshold_Min 0.45和Threshold_Max 0.60之间,因此返回的Normalized_%为50%。问题是Threshold_Min和Max值不是线性的。有人能指出我如何编写脚本吗?

1 个答案:

答案 0 :(得分:0)

假设你想要Main_Value和最近的(低而不高)或等于Normalized_Value,你可以这样做:

select t1.Main_Value, max(t2.Normalized_Value) as Normalized_Value
from #t1 t1
inner join #t2 t2 on t1.Main_Value >= t2.Threshold_Level
group by t1.Main_Value

#t1#t2替换为正确的表名。