Интерполяция таблицы функций SQL
У меня есть SQL-таблица значений (x,y).
x y
0.0 0.0
0.1 0.4
0.5 1.0
5.0 2.0
6.0 4.0
8.0 4.0
10.0 5.0
Столбец x индексируется. Я использую sqlite.
Моя конечная цель-получить y (x) для любого значения X. Я буду использовать линейную интерполяцию с использованием табличных значений. Аналогично тому, как показано на рисунке ниже.
Есть ли способ выполнить линейную интерполяцию непосредственно с помощью запроса select?
В противном случае было бы достаточно получить значения интервала, где x принадлежит.
Есть ли запрос, который будет дайте мне последнюю меньшую и первую большую пару данного x, чтобы я мог вычислить интерполированное значение y(x)?
Например, если x=2.0 получить:
0.5 1.0
5.0 2.0
В случае, если x находится вне таблицы, чтобы получить два первых / последних значения для выполнения экстраполяции.
Например, если x=20.0 получить:
8.0 4.0
10.0 5.0
2 ответов:
Было бы трудно сделать это в простом SQLLite, без аналитических функций. В более сложных SQL-движках вы можете использовать аналитические функции LEG и LEAD для получения необходимого набора пар достаточно легко. Однако в SQLLite я бы создал два курсора, таких как:
Курсор C1:
SELECT x,y FROM table WHERE x>=2 ORDER BY x asc ;Курсор C2:
SELECT x,y FROM table WHERE x<=2 ORDER BY x desc ;И выполнить остальные операции на другом языке-выборку один раз из обоих, или, если один курсор не возвращает значение, дважды из другого. Кроме того, некоторые дополнительные исключения должны быть обработаны - что делать, если ваш набор имеет меньше двух значений. Или если вы дали X в своем наборе-вам вообще не нужны интерполяты... И так далее.
Я бы пошел с простой вычиткой.
Вы смотрите на два ближайших входа так:
SELECT x, y FROM my_table ORDER BY Abs(:val - x) LIMIT 2Однако это приведет к полному сканированию таблицы.

Comments