Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хитрый мерж двух таблиц / 4 сообщений из 4, страница 1 из 1
22.11.2020, 19:00
    #40021125
minya13_85
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый мерж двух таблиц
Есть две таблицы (срок действия каждого значения ID - С и ПО), одна src_data - это таблица с уже имеющимися данными, другая new_data - это таблица с новыми данными (иногда приходят те же самые данные), PK в двух таблицах это ID+Dt_From.
Если значение ID действуют по текущий день, то дату присваивают 2079-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'2079-01-01' dt_to
                from dual
                union
                select 2 id,7 val,date'1980-01-01' dt_from,date'2079-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'2079-01-01' dt_to
                from dual
                union
                select 4 id,18 val,date'1980-01-01' dt_from,date'2079-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'2079-01-01' dt_to
                from dual
                union
                select 7 id,3 val,date'2020-08-01'dt_from, date'2079-01-01' dt_to
                from dual
                union
                select 9 id,65 val,date'1980-01-01' dt_from,date'2079-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'2079-01-01' dt_to
                from dual
                union
                select 2 id,17 val,date'2020-10-01'dt_from, date'2079-01-01' dt_to
                from dual
                union
                select 5 id,20 val,date'2020-10-01'dt_from, date'2079-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'2079-01-01' dt_to
                from dual
                union
                select 6 id,15 val,date'2020-06-01'dt_from, date'2079-01-01' dt_to
                from dual
               union 
                select 7 id,9 val,date'2020-07-01'dt_from, date'2079-01-01' dt_to
                from dual
               )



Как сделать MERGE двух таблиц? Если к ID пришло новое значение и мы не знаем дату открытия (1980-01-01), то предыдущую запись закрываем текущей датой, а новую запись начинаем +1 день от текущей, а если знаем дату открытия след записи, то предыдущую запись закрываем -1 день от даты открытия новой записи.
В итоге должны получить таблицу вида
ID VAL DT_FROM DT_TO1 3 2020-07-01 2020-07-311 5 2020-08-01 2020-08-311 6 2020-09-01 2020-09-301 7 2020-10-01 2079-01-012 17 2020-10-01 getdate()2 7 getdate()+1 2079-01-013 8 2020-09-01 2020-09-303 18 2020-10-01 2079-01-014 18 2020-07-01 2020-07-314 28 2020-08-01 getdate()4 18 getdate()+1 2079-01-015 20 2020-10-01 2079-01-016 15 2020-06-01 2020-07-316 35 2020-08-01 2079-01-017 9 2020-07-01 2020-07-317 3 2020-08-01 2079-01-019 65 1980-01-01 2079-01-01
...
Рейтинг: 0 / 0
22.11.2020, 20:29
    #40021158
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый мерж двух таблиц
minya13_85,

зачем вы храните "от"-"по", если у вас интервалы без пропусков? Храните только данные "от", этого достаточно. В случае этого способа хранения при вставке вычисления не потребуются.

Извлечь указанный результирующий набор данных можно запросом, например, сохранённым в виде представления.
...
Рейтинг: 0 / 0
23.11.2020, 00:12
    #40021204
minya13_85
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый мерж двух таблиц
Владислав Колосов,

Так хранится в системе. Нужно сделать именно С и ПО
...
Рейтинг: 0 / 0
23.11.2020, 12:45
    #40021334
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хитрый мерж двух таблиц
minya13_85
Владислав Колосов,

Так хранится в системе. Нужно сделать именно С и ПО


Если нужно - сделайте.
Вам же объяснили "как надо делать"?
ПО - восстановите из таблицы, ПОСЛЕ ВСТАВКИ.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хитрый мерж двух таблиц / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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