2

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

基本上,我有一个主数据表,单列中有许多行十进制值,例如:

Main_Value
0.33
0.12
0.56
0.42
0.1  

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

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 列中的相邻值进行插值(这将在这个例子)。

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

有人指出我可以使用某种舍入,所以我在下面提供了一个更详细的表格。我希望 SQL 查询查找位于下表中 Threshold_Min 和 Threshold_Max 值之间的每个 Main_Value(来自上面的第一个表),并返回“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 值不是线性的。谁能指出我如何编写脚本的方向?

4

1 回答 1

0

假设您想要Main_Valueand 最接近的(低而不高)或 equal 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

于 2012-02-23T14:19:35.297 回答