Oracle-группировка значений по интервалу

мне нужно запросить таблицу, содержащую идентификатор шага + значение. В результате будут перечислены интервалы вместе с их соответствующим значением. Интервалы здесь определяются как"последовательность непрерывных идентификаторов шагов, имеющих одинаковое значение данных".

мне трудно описать это словами, поэтому, пожалуйста, посмотрите это:

из таблицы

  Step ! Data
  ------------
   1   !  A
   2   !  A
   3   !  A
   5   !  A
   6   !  B
  10   !  A

мне нужен следующий отчет

  From ! To   ! Data
  -------------------
     1 !   3  !   A
     5 !   5  !   A
     6 ! null !   B
    10 ! null !   A

Я думал, что lead () поможет мне здесь, но не сделал преуспевать.

2 ответов


select      min (step)                                                   as "from"
           ,nullif (max (step),max(min(step)) over (partition by data))  as "to"
           ,data

from       (select      step,data
                       ,row_number () over (partition by data order by step) as n

            from        t
            ) 

group by    data
           ,step - n            

order by    "from"           

вы можете сделать это, генерируя последовательность чисел и вычитая из step. Это будет константа, когда значения будут последовательными:

select min(step) as from_step, max(step) as to_step, data
from (select t.*,
            row_number() over (partition by data order by step) as seqnum
     from t
    ) t
group by (step - seqnum), data;

EDIT:

не совсем понятно, где NULLs идут от. Если я предположу, что они являются последними значениями для каждого значения, вы можете сделать:

select min(step) as from_step,
       (case when max(step) <> max_step then max(step) end) as to_step,
       data
from (select t.*,
             max(step) over (partition by data) as max_step
             row_number() over (partition by data order by step) as seqnum
     from t
    ) t
group by (step - seqnum), data, max_step;