Я ищу запрос, который занимает в основном последовательные дни и группирует их в зависимости от того, являются ли они действительно последовательными, и от значения, относящегося к этой дате. Я использую Oracle версии 11g.
Это пример данных:
date value
2012-01-01 2000
2012-01-02 2000 //(there is no data for Jan 03 for example)
2012-01-04 2000
2012-01-05 5000
2012-01-06 5000
2012-01-07 5000
2012-01-08 2000
2012-01-09 2000
2012-01-10 2000
(это результат довольно большого запроса)
То, что я ищу, сгруппировало бы эти дни в такие периоды:
from_date to_date value
2012-01-01 2012-01-02 2000
2012-01-04 2012-01-04 2000
2012-01-05 2012-01-07 5000
2012-01-08 2012-01-10 2000
Нам удалось сформулировать запрос, который делает то, что я хочу, но это не очень эффективный способ, и я уверен, что существует что-то лучшее / более элегантное. Вот что я сейчас использую:
with temp_table as (
select a.pk_date DATE1, c.pk_date DATE2, a.volume VOL1
from dm_2203 a, dm_2203 c
where a.volume = c.volume
and a.pk_date <= c.pk_date
and not exists (select 1 from dm_2203 b
where a.volume = b.volume
and a.pk_date = b.pk_date+1)
and not exists (select 1 from dm_2203 d
where c.volume = d.volume
and c.pk_date = d.pk_date-1) )
select * from temp_table y
where date2-date1+1 = (select count(*)
from dm_2203 z
where z.pk_date between y.date1 and y.date2
and y.vol1 = z.volume)
order by 1;
У кого-нибудь есть идеи, как сделать это быстрее и без всех объединений? Спасибо!