powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Хитрый мерж двух таблиц
4 сообщений из 4, страница 1 из 1
Хитрый мерж двух таблиц
    #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
Хитрый мерж двух таблиц
    #40021158
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
minya13_85,

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

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

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

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


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


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