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:
не совсем понятно, где NULL
s идут от. Если я предположу, что они являются последними значениями для каждого значения, вы можете сделать:
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;