Как интерполировать в sql server?

Я использую приложение Windows Form MS Visual Studio 2017 и SQL Server. Например, вот таблица с данными,

ColumnA | ColumnB
1099    | 57
1209    | 58
1213    | 59
1227    | 60
1228    | 61

Если мы передаем точное значение (то есть) 1213 в столбце A, я могу получить 59 из данных столбца B. Теперь, как интерполировать, если мы передаем 1210 в ColumnA:

(1210-1209)/(1213-1210) = (x-58)/(59-x) ==> x = 58.25

Пожалуйста, помогите закодировать это. Заранее спасибо.

Вы используете Microsoft SQL Server или MySQL? Удалите теги вопроса, которые не применяются, и добавьте тег для конкретной версии СУБД.

Dan Guzman 21.03.2019 12:22

Вы хотите сделать это в TSQL или C#?

Code Pope 21.03.2019 12:28
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
82
2

Ответы 2

Попробуйте выполнить запрос ниже:

declare @tbl table (ColA int, ColB int);
insert into @tbl values
(1099 , 57),
(1209 , 58),
(1213 , 59),
(1227 , 60),
(1228 , 61);

declare @toInterpolate int = 1210;

select min(colB) + (@toInterpolate - min(ColA))*1.0/(max(colA) - min(colA))
from (
    select top 2 ROW_NUMBER() OVER (PARTITION BY CASE WHEN ColA > @Value THEN 1 ELSE 0 END ORDER BY ABS(ColA - @Value)) rn,
                 ColA,
                 ColB
    from @tbl
    order by rn
) a

ПРИМЕЧАНИЕ. Я предположил, что значения в ColumnB увеличиваются.

@RaymondNijland Обратите внимание, что разница в abs, а не только в самой ценности :)

Michał Turczyn 21.03.2019 12:44

Это работает только для 1210, но не для 1220, например.

Daniel Brughera 21.03.2019 13:24

@DanielBrughera Он также работает для 1220, выводит 59,5, как и должно быть.

Michał Turczyn 21.03.2019 13:33

Извините, с 1221 по 1226 и с 1214 по 1218

Daniel Brughera 21.03.2019 13:38

В некоторых случаях пара значений, которые вы получаете, меньше или больше, чем входные данные.

Daniel Brughera 21.03.2019 13:45

Попробуй это

CREATE TABLE #YourTable (ColumnA float, ColumnB float)
INSERT #YourTable values
(1099 , 57),
(1209 , 58),
(1213 , 59),
(1227 , 60),
(1228 , 61);

DECLARE @Value float = 1221

select *, a.ColumnB + (@Value - a.ColumnA)/ISNULL(NULLIF((b.ColumnA - a.ColumnA),0),1)
from (
    select top 1 ColumnA,
                 ColumnB
    from #YourTable
    where ColumnA <= @Value
    order by ColumnA desc
) a
cross join (
    select top 1 ColumnA,
                 ColumnB
    from #YourTable
    where ColumnA >= @Value
) b

DROP TABLE #YourTable

Другие вопросы по теме