Интерполяция таблицы функций 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
793   2  

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

    Ничего не найдено.