Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 sql-запрос с периодом  [new]
reaque
Member

Откуда:
Сообщений: 84
Добрый день.

Есть таблица

№ Дата Период (в месяцах)
1 01.01.2014 5
2 01.02.2014 4
3 01.03.2014 3
4 01.04.2014 2
5 01.05.2014 1

Надо получить список событий на 2014 год.
Должно получиться:

1 01.06.2014
1 01.11.2014
2 01.06.2014
2 01.10.2014
3 01.06.2014
3 01.09.2014
3 01.12.2014
4 01.06.2014
4 01.08.2014
4 01.10.2014
4 01.12.2014
5 01.06.2014
5 01.07.2014
5 01.08.2014
5 01.09.2014
5 01.10.2014
5 01.11.2014
5 01.12.2014

Есть идеи?
8 май 14, 20:40    [15993251]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос с периодом  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
with t as (
           select 1 n,to_date('01.01.2014','dd.mm.yyyy') dt,5 period from dual union all
           select 2,to_date('01.02.2014','dd.mm.yyyy'),4 from dual union all
           select 3,to_date('01.03.2014','dd.mm.yyyy'),3 from dual union all
           select 4,to_date('01.04.2014','dd.mm.yyyy'),2 from dual union all
           select 5,to_date('01.05.2014','dd.mm.yyyy'),1 from dual
          )
select  n,
        to_char(add_months(dt,period * level),'dd.mm.yyyy') dt
  from  t
  connect by n = prior n
      and prior sys_guid() is not null
      and trunc(add_months(dt,period * level),'yy') = trunc(dt,'yy')
  order by n,
           t.dt
/

         N DT
---------- ----------
         1 01.06.2014
         1 01.11.2014
         2 01.06.2014
         2 01.10.2014
         3 01.06.2014
         3 01.09.2014
         3 01.12.2014
         4 01.06.2014
         4 01.08.2014
         4 01.12.2014
         4 01.10.2014

         N DT
---------- ----------
         5 01.06.2014
         5 01.07.2014
         5 01.08.2014
         5 01.09.2014
         5 01.11.2014
         5 01.10.2014
         5 01.12.2014

18 rows selected.

SQL> 


SY.
8 май 14, 21:53    [15993410]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос с периодом  [new]
reaque
Member

Откуда:
Сообщений: 84
Спасибо за отклик.
Но как быть, если у меня не 5 строк с датами, а тысячи?
8 май 14, 21:56    [15993425]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос с периодом  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
reaque
Спасибо за отклик.
Но как быть, если у меня не 5 строк с датами, а тысячи?


??? WITH это временное создание таблицы налету. Т.e. это твоя таблица налету. Так как у тебя она не налету то просто выкидываешь WITH:

select  n,
        to_char(add_months(dt,period * level),'dd.mm.yyyy') dt
  from  твоя_таблица t
  connect by n = prior n
      and prior sys_guid() is not null
      and trunc(add_months(dt,period * level),'yy') = trunc(dt,'yy')
  order by n,
           t.dt
/


SY.
8 май 14, 22:34    [15993617]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос с периодом  [new]
reaque
Member

Откуда:
Сообщений: 84
Спасибо =)
8 май 14, 22:36    [15993633]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос с периодом  [new]
reaque
Member

Откуда:
Сообщений: 84
Нашел небольшой баг.
Если добавить запись шестую запись с большим периодом
№ Дата Период (в месяцах)
1 01.01.2014 5
2 01.02.2014 4
3 01.03.2014 3
4 01.04.2014 2
5 01.05.2014 1
6 01.06.2014 8

То дата становится 2015 года и НО при этом попадает в выборку.
Можно конечно обернуть этот запрос в select с условием where,
но кажется мне есть более элегантный способ.
8 май 14, 23:39    [15993974]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос с периодом  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
reaque
Нашел небольшой баг.


with t as (
           select 1 n,to_date('01.01.2014','dd.mm.yyyy') dt,5 period from dual union all
           select 2,to_date('01.02.2014','dd.mm.yyyy'),4 from dual union all
           select 3,to_date('01.03.2014','dd.mm.yyyy'),3 from dual union all
           select 4,to_date('01.04.2014','dd.mm.yyyy'),2 from dual union all
           select 5,to_date('01.05.2014','dd.mm.yyyy'),1 from dual union all
           select 6,to_date('01.06.2014','dd.mm.yyyy'),8 from dual
          )
select  n,
        to_char(add_months(dt,period * level),'dd.mm.yyyy') dt
  from  t
  start with trunc(add_months(dt,period),'yy') = trunc(dt,'yy')
  connect by n = prior n
      and prior sys_guid() is not null
      and trunc(add_months(dt,period * level),'yy') = trunc(dt,'yy')
  order by n,
           t.dt
/

         N DT
---------- ----------
         1 01.06.2014
         1 01.11.2014
         2 01.06.2014
         2 01.10.2014
         3 01.06.2014
         3 01.09.2014
         3 01.12.2014
         4 01.06.2014
         4 01.08.2014
         4 01.12.2014
         4 01.10.2014

         N DT
---------- ----------
         5 01.06.2014
         5 01.07.2014
         5 01.08.2014
         5 01.09.2014
         5 01.11.2014
         5 01.10.2014
         5 01.12.2014

18 rows selected.

SQL>


SY.
9 май 14, 00:55    [15994169]     Ответить | Цитировать Сообщить модератору
 Re: sql-запрос с периодом  [new]
reaque
Member

Откуда:
Сообщений: 84
SY,

Спасибо =)
12 май 14, 09:00    [16002293]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить