Запрос с ранжированием

Edgar_Prima
Дата: 22.09.2015 09:30:57
Всем привет, никак не придумаю, как реализовать запрос, если кто знает, подскажите, пожалуйста.
Долго объяснять условия, вот имеющееся "до" и ниже желаемое "после":

Исходная таблица:

emp_id Dat Title

1 01.01.2012 Специалист
1 01.02.2012 Специалист
1 01.03.2012 Специалист
1 01.04.2012 Специалист
1 01.05.2012 Специалист
1 01.06.2012 Специалист
1 01.07.2012 Специалист
1 01.08.2012 Специалист
1 01.09.2012 Старший специалист
1 01.10.2012 Старший специалист
1 01.11.2012 Старший специалист
1 01.12.2012 Старший специалист
1 01.01.2013 Старший специалист
1 01.02.2013 Специалист
1 01.03.2013 Специалист
1 01.04.2013 Специалист

Что я хочу получить:

Date_interval Title
01.01.2012 - 01.08.2012 Специалист
01.09.2012 - 01.01.2013 Старший специалист
01.02.2013 - 01.04.2013 Специалист
Elic
Дата: 22.09.2015 09:32:42
STFF start_of_group vs match_recognize
Edgar_Prima
Дата: 22.09.2015 09:34:11
create table sql_ru
(
dat DATE,
title VARCHAR2(50),
emp_id NUMBER
);


insert into KATY (dat, title, emp_id)
values (to_date('01-01-2012', 'dd-mm-yyyy'), 'Специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-02-2012', 'dd-mm-yyyy'), 'Специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-03-2012', 'dd-mm-yyyy'), 'Специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-04-2012', 'dd-mm-yyyy'), 'Специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-05-2012', 'dd-mm-yyyy'), 'Специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-06-2012', 'dd-mm-yyyy'), 'Специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-07-2012', 'dd-mm-yyyy'), 'Специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-08-2012', 'dd-mm-yyyy'), 'Специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-09-2012', 'dd-mm-yyyy'), 'Старший специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-10-2012', 'dd-mm-yyyy'), 'Старший специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-11-2012', 'dd-mm-yyyy'), 'Старший специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-12-2012', 'dd-mm-yyyy'), 'Старший специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-01-2013', 'dd-mm-yyyy'), 'Старший специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-02-2013', 'dd-mm-yyyy'), 'Специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-03-2013', 'dd-mm-yyyy'), 'Специалист', 1);
insert into KATY (dat, title, emp_id)
values (to_date('01-04-2013', 'dd-mm-yyyy'), 'Специалист', 1);
commit;
Edgar_Prima
Дата: 22.09.2015 09:35:25
Elic,

большое спасибо, сейчас погулю!
Zloxa
Дата: 22.09.2015 10:12:25
Просто поупражнялся с патернматчингом
Connected to Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 

SQL> select *
  2  from
  3      sql_ru
  4  match_recognize
  5  (
  6      partition by emp_id
  7      order by dat
  8      measures min(dat) from_dat, max(dat) to_dat, title title
  9      after match skip to last eq
 10      pattern (strt eq+)
 11      define eq as title = prev(title)
 12  )
 13  /
    EMP_ID FROM_DAT    TO_DAT      TITLE
---------- ----------- ----------- --------------------------------------------------
         1 01.01.2012  01.08.2012  Специалист
         1 01.09.2012  01.01.2013  Старший специалист
         1 01.02.2013  01.04.2013  Специалист
Edgar_Prima
Дата: 22.09.2015 10:45:18
Zloxa,

Жаль, у меня 11.1 стоит
Добрый Э - Эх
Дата: 22.09.2015 10:51:39
Edgar_Prima
Zloxa,

Жаль, у меня 11.1 стоит

вот тебе решение от 8i и дальше:
select emp_id, min(dat) as "Начало", max(dat) as "Кончало",  title
  from (
         select t.*
              , row_number() over(partition by emp_id,title order by dat)
              - row_number() over(order by dat) as grp_id
           from katy t
       )
 group by emp_id, title, grp_id
 order by emp_id, min(dat)

до 8i можно заюзать ROWNUM, скорее всего.
Добрый Э - Эх
Дата: 22.09.2015 10:59:51
Добрый Э - Эх
до 8i можно заюзать ROWNUM, скорее всего.
точно можно:
select emp_id, min(dat) as "Начало", max(dat) as "Кончало", title
  from (
         select v1.*, rownum as rn2
           from (
                  select v0.*, rownum as rn1
                    from (
                           select t.*
                             from katy t
                            order by emp_id, dat 
                         ) v0
                   order by emp_id, title, dat 
                ) v1
       ) v2
 group by emp_id, title, rn1 - rn2
 order by emp_id, min(dat)
Edgar_Prima
Дата: 23.09.2015 08:57:53
Добрый Э - Эх,

большое спасибо!