Линейная интерполяция SQL на основе таблицы соответствия - PullRequest
2 голосов
/ 23 февраля 2012

Мне нужно встроить линейную интерполяцию в запрос 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 (что даст из 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 голосов
/ 23 февраля 2012

Если вы хотите, чтобы 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 на правильные имена таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...