Доступ к текущему значению строки с помощью функции задержки

Я хочу вычислить разницу между предыдущим и текущим столбцом и сделать его новым столбцом с именем increase. Для этого я использую lag оконную функцию. Значение первого столбца не определено, поскольку предыдущего столбца не существует. Я знаю, что третий параметр указывает значение по умолчанию. Однако это зависит от обстоятельств. Для первой строки я хочу использовать значение другого столбца, например. один из count из текущей строки. Это предполагает, что 0 увеличивается для подсчета для первой строки, что мне нужно. Указание имени столбца в качестве 3-го аргумента для функции lag не работает правильно, равно как и использование 0. Как это можно сделать? Я получаю странные результаты, например, совершенно случайный результат или даже отрицательные числа.

SELECT *, mycount - lag(mycount, 1) OVER (ORDER BY id, messtime ASC) AS increase FROM measurements;

Оконные функции также не могут быть вложенными:

ERROR: window function calls cannot be nested

person BullyWiiPlaza    schedule 15.04.2016    source источник
comment
Предоставьте образцы данных (дюжина строк) и укажите правильный результат запроса для этих образцов данных.   -  person Vladimir Baranov    schedule 16.04.2016


Ответы (2)


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

Добавьте ORDER BY id, messtime в свой запрос, чтобы увидеть строки по порядку. Теперь вы можете напрямую сравнить одну строку с предыдущей. Есть еще проблемы? Если да, то какой именно?

SELECT *, "count" - lag("count", 1) OVER (ORDER BY id, messtime) AS increase
FROM measurements
ORDER BY id, messtime;
person Thorsten Kettner    schedule 16.04.2016

COUNT - зарезервированное слово в SQL. Похоже, СУБД думает, что вы хотите как-то вложить COUNT и LAG.

Используйте другое имя столбца или используйте кавычки для столбца:

SELECT *, "count" - lag("count", 1) OVER 
person Thorsten Kettner    schedule 15.04.2016
comment
Здесь проблема не в этом. Извините за путаницу - person BullyWiiPlaza; 16.04.2016