Я ищу запрос, который берет в основном последовательные дни и группирует их вместе в зависимости от того, действительно ли они последовательно и по значению, принадлежащему этой дате. Я использую Oracle версии 11g.Группа a (иногда не последовательный) период дней в Oracle SQL
Это несколько примеров данных:
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;
Кто-нибудь есть идеи о том, как сделать это быстрее и без всех стыков? Благодаря!
Какая версия Oracle это? –
Я не понимаю логику для вашего желаемого вывода, почему эти две строки выводят? – Lamak
@Lamak: набор из двух строк не является желаемым выходом - набор из четырех строк является желаемым выходом. –