powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / получить таблицу вида
1 сообщений из 1, страница 1 из 1
получить таблицу вида
    #40020905
minya13_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть две таблицы (срок действия каждого значения ID - С и ПО), одна src_data - это таблица с уже имеющимися данными, другая new_data - это таблица с новыми данными (иногда приходят те же самые данные), PK в двух таблицах это ID+Dt_From.
Если значение ID действуют по текущий день, то дату присваивают 4444-01-01. Начальная дата иногда определена, иногда нет и она = 1980-01-01.

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

Код: sql
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
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_TO132020-07-012020-07-31152020-08-012020-08-31162020-09-012020-09-30172020-10-014444-01-012172020-10-01trunc(sysdate)27trunc(sysdate)+14444-01-01382020-09-012020-09-303182020-10-014444-01-014182020-07-012020-07-314282020-08-01trunc(sysdate)418trunc(sysdate)+14444-01-015202020-10-014444-01-016152020-06-012020-07-316352020-08-014444-01-01792020-07-012020-07-31732020-08-014444-01-019651980-01-014444-01-01
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / получить таблицу вида
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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