powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Создать пустые временные промежутки
6 сообщений из 6, страница 1 из 1
Создать пустые временные промежутки
    #39417646
Heisenberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
здравствуйте, уважаемые

имеется такая вот оперативная табличка из базы "Зоопарк"

Клеткa N Зверь Заселился Выехал 6 Крокодил 1.01.2017 1.02.2017 6 Слон 15.02.2017 1.03.2017 7 Жираф 1.01.2017 28.02.2017 7 Бегемот 15.03.2017 31.12.9999 (живет там пока)

есть процедура экспорта, которая перекачивает данные в другую табличку, пока что один insert с рядом условий и джойнов

требуется, чтобы вторая табличка приобрела после закачки вот такой вид

Клеткa N Зверь Заселился Выехал 6 Крокодил 1.01.2017 1.02.2017 6 (никого) 2.02.2017 14.02.2017 6 Слон 15.02.2017 1.03.2017 6 (никого) 2.03.2017 31.12.9999 (клетка пока стоит пустая) 7 Жираф 1.01.2017 28.02.2017 7 (никого) 1.03.2017 14.03.2017 7 Бегемот 15.03.2017 31.12.9999 (живет там пока)

в общем идея в том, чтобы если клетка стоит пустая, это нужно отразить в таблице

это можно как-то отразить одним insert'ом? или нужно как-то этим самым PL/SQL'ем по таблице потом идти?
подкиньте умных мыслей, камрады, я пока даже не знаю, с какой стороны подступиться
...
Рейтинг: 0 / 0
Создать пустые временные промежутки
    #39417691
grok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что у вас если есть клетка в которой никогда никого не было ?
или данный случай не рассматривать ?
...
Рейтинг: 0 / 0
Создать пустые временные промежутки
    #39417790
Heisenberg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grok, если клетка, в которой никогда никого не было, то

Клетка Зверь Вьехал Выехал 16 (никого) 01.01.1900 31.12.9999
...
Рейтинг: 0 / 0
Создать пустые временные промежутки
    #39417960
Как-то так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with t (kl,name,d_s,d_e) as (
select 6, 'Крокодил  ', to_date('1.01.2017  ', 'dd.mm.rrrr'), to_date('5.01.2017 ', 'dd.mm.rrrr') from dual union all
select 6, 'Слон      ', to_date('15.02.2017 ', 'dd.mm.rrrr'), to_date('1.03.2017 ', 'dd.mm.rrrr') from dual union all
select 7, 'Жираф     ', to_date('1.01.2017  ', 'dd.mm.rrrr'), to_date('28.02.2017', 'dd.mm.rrrr') from dual union all
select 7, 'Бегемот   ', to_date('15.03.2017 ', 'dd.mm.rrrr'), to_date('31.12.2099', 'dd.mm.rrrr') from dual),
d as (select ds - 1 + level as d from (select min(d_s) ds, max(d_e) de from t) connect by level <= de - ds + 1)  
select kl, name, 
       min(d), max(d)
from (
select t.*,
       sum(gr) over (order by kl, d) as st_of_gr
from (
select d.*, t.*,
       case 
         when nvl(lag(t.name) over (partition by t.kl order by d.d), 'пусто') <> nvl(t.name, 'пусто') then 1
       end gr 
from d
left join t partition by (t.kl) on d.d between t.d_s and t.d_e
  ) t
  ) t
group by st_of_gr, kl, name 
 order by kl,  min(d)  
...
Рейтинг: 0 / 0
Создать пустые временные промежутки
    #39418227
Glays
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
WITH t (kl,
        name,
        d_s,
        d_e)
     AS (
select 6, 'Крокодил  ', to_date('1.01.2017  ', 'dd.mm.rrrr'), to_date('5.01.2017 ', 'dd.mm.rrrr') from dual union all
select 6, 'Слон      ', to_date('15.02.2017 ', 'dd.mm.rrrr'), to_date('1.03.2017 ', 'dd.mm.rrrr') from dual union all
select 7, 'Жираф     ', to_date('1.01.2017  ', 'dd.mm.rrrr'), to_date('28.02.2017', 'dd.mm.rrrr') from dual union all
select 7, 'Бегемот   ', to_date('15.03.2017 ', 'dd.mm.rrrr'), to_date('31.12.2099', 'dd.mm.rrrr') from dual)
    SELECT kl,
           CASE WHEN LEVEL = 1 THEN name END AS name,
           CASE WHEN LEVEL = 1 THEN d_s ELSE d_s - dates_add + 1 END AS d_s,
           CASE WHEN LEVEL = 1 THEN d_e ELSE d_s - 1 END AS d_e,
           LEVEL
      FROM (SELECT t.*,
                   d_s - LAG (d_e) OVER (PARTITION BY kl ORDER BY d_s)
                      AS dates_add
              FROM t) a
CONNECT BY     LEVEL <= NVL2 (dates_add, 2, 0)
           AND PRIOR kl = kl
           AND PRIOR d_s = d_s
           AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
  ORDER BY kl, d_s




Heisenberggrok, если клетка, в которой никогда никого не было, то

Клетка Зверь Вьехал Выехал 16 (никого) 01.01.1900 31.12.9999
сами топите урановые ломы в ртути решается джойном справочника клеток.
...
Рейтинг: 0 / 0
Создать пустые временные промежутки
    #39418301
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Heisenberg,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
with t (kl,name,d_s,d_e) as (
select 6, 'Крокодил  ', to_date('1.01.2017  ', 'dd.mm.rrrr'), to_date('5.01.2017 ', 'dd.mm.rrrr') from dual union all
select 6, 'Їжачок    ', to_date('6.01.2017  ', 'dd.mm.rrrr'), to_date('10.01.2017 ', 'dd.mm.rrrr') from dual union all
select 6, 'Слон      ', to_date('15.02.2017 ', 'dd.mm.rrrr'), to_date('1.03.2017 ', 'dd.mm.rrrr') from dual union all
select 7, 'Жираф     ', to_date('1.01.2017  ', 'dd.mm.rrrr'), to_date('28.02.2017', 'dd.mm.rrrr') from dual union all
select 7, 'Бегемот   ', to_date('15.03.2017 ', 'dd.mm.rrrr'), to_date('31.12.2099', 'dd.mm.rrrr') from dual)
select * from t
union all
select kl,'Пусто',d_s,d_l from
  (select kl,d_e+1 d_s,d_e,lead(d_s) over (partition by kl order by d_s)-1 d_l 
   from t
  ) where d_l<>d_e
order by 1,3
SQL> /

        KL NAME       D_S      D_E
---------- ---------- -------- --------
         6 Крокодил   01.01.17 05.01.17
         6 Їжачок     06.01.17 10.01.17
         6 Пусто      11.01.17 14.02.17
         6 Слон       15.02.17 01.03.17
         7 Жираф      01.01.17 28.02.17
         7 Пусто      01.03.17 14.03.17
         7 Бегемот    15.03.17 31.12.99

7 rows selected.



.....
stax
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Создать пустые временные промежутки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]