Найти разность дат между двумя соседними строками в MS SQL

Есть SQL Server 11. Есть примерно следующая таблица Statuses

------------------------------------
| Id | DateTimeUtc         | Status |
------------------------------------
| 1  | 2020-02-08 15:23:00 | Moving |
| 2  | 2020-02-08 15:26:00 | Moving |
| 3  | 2020-02-08 15:29:00 | Moving |
| 4  | 2020-02-08 15:39:00 | Moving |
| 5  | 2020-02-08 15:43:00 | Moving |
| ...                               |
------------------------------------

Как я могу выбрать Id записей, у которых разность между предыдущим по времени статусом больше 3 минут? Ожидаю примерно следующее:

SELECT Id
FROM Statuses
WHERE DATEDIFF(MINUTE, [current].DateTimeUtc, [prev].DateTimeUtc) > 3
ORDER BY DateTimeUtc

Данных много, поэтому желательно использовать эффективный по времени выполнения запрос. Из того что я находил, были функции LAG / LEAD, но в 11 версии их нет.


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

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

Без использования оконных функций:

SELECT t1.*
FROM Statuses t1
JOIN Statuses t2 ON DATEDIFF(MINUTE, t1.DateTimeUtc, t2.DateTimeUtc) > 3
WHERE NOT EXISTS ( SELECT NULL
                   FROM Statuses t3
                   WHERE t1.DateTimeUtc > t3.DateTimeUtc
                     AND t3.DateTimeUtc > t2.DateTimeUtc )
→ Ссылка