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

Откуда: Москва
Сообщений: 602
Есть две таблицы (срок действия каждого значения ID - С и ПО), одна src_data - это таблица с уже имеющимися данными, другая new_data - это таблица с новыми данными (иногда приходят те же самые данные), PK в двух таблицах это ID+Dt_From.
Если значение ID действуют по текущий день, то дату присваивают 4444-01-01. Начальная дата иногда определена, иногда нет и она = 1980-01-01.

Вот пример двух таблиц

with 
        new_data as
               (
                select 1 id,3 val,date'2020-07-01'dt_from, date'2020-07-31' dt_to
                from dual
                union
                select 1 id,5 val,date'2020-08-01'dt_from, date'2020-08-31' dt_to
                from dual
                union
                select 1 id,6 val,date'2020-09-01'dt_from, date'2020-09-30' dt_to
                from dual
                union
                select 1 id,7 val,date'2020-10-01'dt_from, date'4444-01-01' dt_to
                from dual
                union
                select 2 id,7 val,date'1980-01-01' dt_from,date'4444-01-01' dt_to
                from dual
                union
                select 3 id,8 val,date'2020-09-01'dt_from, date'2020-09-30' dt_to
                from dual
                union
                select 3 id,18 val,date'2020-10-01'dt_from, date'4444-01-01' dt_to
                from dual
                union
                select 4 id,18 val,date'1980-01-01' dt_from,date'4444-01-01' dt_to
                from dual
                 union
                select 6 id,15 val,date'2020-07-01'dt_from, date'2020-07-31' dt_to
                from dual
                union
                select 6 id,35 val,date'2020-08-01'dt_from, date'4444-01-01' dt_to
                from dual
                union
                select 7 id,3 val,date'2020-08-01'dt_from, date'4444-01-01' dt_to
                from dual
                union
                select 9 id,65 val,date'1980-01-01' dt_from,date'4444-01-01' dt_to
                from dual
                 ),

        src_data as 
               (select 1 id,3 val,date'2020-07-01'dt_from, date'2020-07-31' dt_to
                from dual
                union
                select 1 id,5 val,date'2020-08-01'dt_from, date'4444-01-01' dt_to
                from dual
                union
                select 2 id,17 val,date'2020-10-01'dt_from, date'4444-01-01' dt_to
                from dual
                union
                select 5 id,20 val,date'2020-10-01'dt_from, date'4444-01-01' dt_to
                from dual
                union
                select 4 id,18 val,date'2020-07-01'dt_from, date'2020-07-31' dt_to
                from dual
                union
                select 4 id,28 val,date'2020-08-01'dt_from, date'4444-01-01' dt_to
                from dual
                union
                select 6 id,15 val,date'2020-06-01'dt_from, date'4444-01-01' dt_to
                from dual
               union 
                select 7 id,9 val,date'2020-07-01'dt_from, date'4444-01-01' dt_to
                from dual
               )


Как сделать MERGE двух таблиц? Если к ID пришло новое значение и мы не знаем дату открытия (1980-01-01), то предыдущую запись закрываем текущей датой, а новую запись начинаем +1 день от текущей, а если знаем дату открытия след записи, то предыдущую запись закрываем -1 день от даты открытия новой записи.
В итоге должны получить таблицу вида

ID VAL DT_FROMDT_TO
132020-07-012020-07-31
152020-08-012020-08-31
162020-09-012020-09-30
172020-10-014444-01-01
2172020-10-01trunc(sysdate)
27trunc(sysdate)+14444-01-01
382020-09-012020-09-30
3182020-10-014444-01-01
4182020-07-012020-07-31
4282020-08-01trunc(sysdate)
418trunc(sysdate)+14444-01-01
5202020-10-014444-01-01
6152020-06-012020-07-31
6352020-08-014444-01-01
792020-07-012020-07-31
732020-08-014444-01-01
9651980-01-014444-01-01


Сообщение было отредактировано: 20 ноя 20, 21:17
20 ноя 20, 21:17    [22236236]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить