Как вернуть значение из предыдущей строки без функции lag? SQL

Есть одна таблица с данными

2023-11-24 19:15:00 ERROR01 3976
2023-11-24 19:30:00 ERROR01 3980
2023-11-24 19:45:00 ERROR01 3985
2023-11-24 20:00:00 ERROR01 3990

Нужно получить следующее

2023-11-24 19:15:00 ERROR01 3976 0
2023-11-24 19:30:00 ERROR01 3980 4
2023-11-24 19:45:00 ERROR01 3985 5
2023-11-24 20:00:00 ERROR01 3990 5

То есть необходимо получить разницу с предыдущей строкой

Функции LAG нет использую druid sql , как реализовать подобное без данной функции?


Ответы (1 шт):

Автор решения: Akina

В общем виде:

SELECT t1.*, t3.data_column AS lead_for_data_column
FROM table t1
LEFT JOIN table t3 ON t1.partition_by_expression = t3.partition_by_expression
                  AND t1.order_by_expression < t3.order_by_expression
                  AND NOT EXISTS ( SELECT NULL
                                   FROM table t2
                                   WHERE t1.partition_by_expression = t2.partition_by_expression
                                     AND t1.order_by_expression < t2.order_by_expression
                                     AND t2.order_by_expression < t3.order_by_expression
                                   );

Переводя на русский: выбрать такие две записи, что между ними нет третьей.

Шаблон выше - для эмуляции LEAD(). Для эмуляции LAG() - понять смысл происходящего и перевернуть, сделав базой более позднюю по критерию сортировки копию.

→ Ссылка