Здравствуйте, FunnyRabbit, Вы писали:
S>>Вариаций на тему указанного мной метода группировки. Ту же идею можно выразить через аналитические функции, но это будет менее удачно — поскольку результат потом все равно надо будет сжимать group by-ем. Вариации с другой исходной посылкой, разумеется, есть.
FR>Согласен, что все сводиться в конечном итоге к группировке. Спасибо за урок. Надеюсь что не последний.
Можно и без группировок.
SQL> create table work_data as
2 (
3 select to_date ( '01.01.2006', 'dd.mm.yyyy' ) work_date, 10 id_work from dual union all
4 select to_date ( '02.01.2006', 'dd.mm.yyyy' ) work_date, 10 id_work from dual union all
5 select to_date ( '03.02.2006', 'dd.mm.yyyy' ) work_date, 20 id_work from dual union all
6 select to_date ( '04.02.2006', 'dd.mm.yyyy' ) work_date, 20 id_work from dual union all
7 select to_date ( '05.02.2006', 'dd.mm.yyyy' ) work_date, 20 id_work from dual union all
8 select to_date ( '03.03.2006', 'dd.mm.yyyy' ) work_date, 50 id_work from dual union all
9 select to_date ( '04.03.2006', 'dd.mm.yyyy' ) work_date, 10 id_work from dual union all
10 select to_date ( '05.03.2006', 'dd.mm.yyyy' ) work_date, 10 id_work from dual
11 );
Table created.
SQL>
SQL> select date_beg, date_end, id_work
2 from (select wrn, id_work,
3 work_date date_beg,
4 lead(work_date, 1, work_date) over(partition by id_work order by id_work, work_date) date_end,
5 row_number() over(partition by id_work order by id_work, work_date) irn
6 from (select wd.*, rownum wrn from work_data wd))
7 where mod(irn, 2) = 1
8 order by wrn;
DATE_BEG DATE_END ID_WORK
---------- ---------- ----------
01.01.2006 02.01.2006 10
03.02.2006 04.02.2006 20
05.02.2006 05.02.2006 20
03.03.2006 03.03.2006 50
04.03.2006 05.03.2006 10
SQL>
SQL> drop table work_data;
Table dropped.