У меня есть таблица, которая содержит время начала (используя номер в примере, чтобы упростить его) и длительности событий.
Я хотел бы определить «блоки» и их начало, а такжевремя окончания.
Всякий раз, когда разница между временем окончания (временем начала + продолжительностью) предыдущей строки (отсортированным по времени начала) и временем начала текущей строки составляет >=5
, новый "блок "должен начинаться.
Это мои тестовые данные, включая попытку графического объяснения в комментариях:
WITH test_data AS (
SELECT 0 s, 2 dur FROM dual UNION ALL --# ■■
SELECT 2 , 2 FROM dual UNION ALL --# ■■
SELECT 10 , 1 FROM dual UNION ALL --# ■
SELECT 13 , 4 FROM dual UNION ALL --# ■■■■
SELECT 15 , 4 FROM dual --# ■■■■
)
--# Should return
--# 0 .. 4 --# ■■■■
--# 10 .. 19 --# ■■■■■■■■■
Первый блок начинается в 0
и заканчивается в 4
.Поскольку разница со следующей строкой составляет >=5
, начните другой блок с 10
, который заканчивается на 19
.
Я могу определить первую строку блока, используя LAG
,но я еще не выяснил, как действовать.
И я мог бы решить эту проблему в PL / SQL-цикле, но я пытаюсь избежать этого по соображениям производительности.
Любые предложения о том, как написать этот запрос?
Заранее спасибо, Питер