Как найти MAX рассчитанного значения в окне? - PullRequest
1 голос
/ 26 сентября 2019

У меня есть простая таблица базы данных с тремя столбцами: id, x, y.x и y - это только координаты точек на линии.Я хочу использовать функцию окна SQLite для разделения таблицы, используя скользящее окно из трех строк, а затем получить значение y, которое является самым дальним от значения y первой координаты (строки) в окне.

Пример:

| id | x | y |
|----|---|---|
|  1 | 1 | .5|
|  2 | 2 | .9|
|  3 | 3 | .7| 
|  4 | 4 |1.1|
|  5 | 5 | 1 |

Таким образом, первый раздел будет состоять из:

| id | x | y |
|----|---|---|
|  1 | 1 | .5|
|  2 | 2 | .9|
|  3 | 3 | .7| 

И желаемый результат будет:

| id | x | y | d |
|----|---|---|---|
|  1 | 1 | .5| .4|
|  2 | 2 | .9|
|  3 | 3 | .7| 

Поскольку окно с id = 1 в качестве CURRENT ROW будет иметь максимальное отклонение .4;максимальное расстояние между y значением первой строки в разделе .5 и .9 составляет .4.

Окончательный ожидаемый результат:

| id | x | y | d |
|----|---|---|---|
|  1 | 1 | .5| .4|
|  2 | 2 | .9| .2|
|  3 | 3 | .7| .4|
|  4 | 4 |1.1| .1|
|  5 | 5 | 1 |   | 

Я пытался использовать оконную функцию, например: WINDOW win1 AS (ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING, которая дает мне правильное окно.

С определенным окном я попытался сделать что-то вроде:

SELECT
    max(abs(y - first_value(y) OVER win1)) AS d
FROM t
WINDOW win1 AS (ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING)

Но я получаю ошибку из-за неправильного использования first_value.

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

1 Ответ

1 голос
/ 26 сентября 2019

Для каждой строки вашей таблицы вы определяете окно, начиная с текущей строки до следующих 2 строк.В вашем коде y - это значение в текущей строке, а first_value() - это 1-е значение y текущего окна, которое также является значением y текущей строки.Таким образом, даже если ваш код синтаксически корректен, вычисленная вами разница всегда будет возвращать 0.Решить вашу проблему проще с помощью оконной функции LEAD():

WITH cte AS (
  SELECT *,
    LEAD(y, 1) OVER () AS y1,
    LEAD(y, 2) OVER () AS y2
  FROM tablename
)  
SELECT 
  id, x, y, 
  MAX(ABS(y - y1), COALESCE(ABS(y - y2), 0)) d 
FROM cte

См. demo .Результаты:

id  x   y   d
1   1   0.5 0.4
2   2   0.9 0.2
3   3   0.7 0.4
4   4   1.1 0.1
5   5   1.0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...