Группировка строк с учетом «разницы» между строками

у меня есть таблица, которая содержит время начала (используя число в примере, чтобы было проще) и продолжительность событий.

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


Есть предложения, как написать этот запрос?

Заранее спасибо, Питер

6
задан Peter Lang 25 November 2010 в 13:01
поделиться