у меня есть таблица, которая содержит время начала (используя число в примере, чтобы было проще) и продолжительность событий.
Я хотел бы идентифицировать «блоки» и их начало- и время конца.
Всякий раз, когда разница между конечным временем (время начала + продолжительность) предыдущей строки (отсортированной по времени начала) и временем начала текущей строки составляет > = 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-цикле, но я пытаюсь избежать этого для производительности причины.
Есть предложения, как написать этот запрос?
Заранее спасибо, Питер