Допустим, что для таблицы observations_tbl
с атрибутами date
(день) и value
я хочу создать новый атрибут prev_day_value
, чтобы получить следующую таблицу:
|---------------------|-------|----------------|
| date | value | prev_day_value |
|---------------------|-------|----------------|
| 01.01.2015 00:00:00 | 5 | 0 |
| 02.01.2015 00:00:00 | 4 | 5 |
| 03.01.2015 00:00:00 | 3 | 4 |
| 04.01.2015 00:00:00 | 2 | 3 |
|---------------------|-------|----------------|
Мне хорошо известно, что такой вывод обычно можно получить с помощью функции WINDOW
. Но как мне добиться этого с помощью пользовательской функции PostgreSQL? Я хочу указать, что я нахожусь в ситуации, когда я должен использовать функцию, трудно объяснить почему, не вдаваясь в подробности - это мои ограничения и, если что-то, это техническая проблема.
Рассмотрим этот шаблон запроса:
SELECT *, lag(value,1) AS prev_day_value -- or lag(record,1) or lag(date,value,1) or lag(date,1) or lag(observations_tbl,1), etc.
FROM observations_tbl
Я использую функцию lag
с параметром 1
, чтобы найти значение, которое предшествует текущей строке на 1
- расстояние 1
строки. Мне все равно, какие другие параметры может иметь функция lag
(имя таблицы, другие атрибуты) - как может выглядеть функция lag
для достижения такой функциональности? Функция может быть любого языка, SQL
, PL/pgSQL
и даже C
с использованием PostgreSQL API / backend.
Я понимаю, что один ответ может заключаться в WINDOW
запросе внутри lag
пользовательская функция. Но я думаю, что это будет довольно дорогостоящей операцией, если мне придется сканировать всю таблицу дважды (один раз внутри функции lag
и один раз снаружи). Я думал, что, возможно, каждая запись PostgreSQL будет иметь указатель на свою предыдущую запись, которая доступна напрямую? Или что я могу каким-то образом открыть курсор на этом указанном c номере строки / строки без необходимости сканирования всей таблицы? Или то, что я спрашиваю, невозможно?