powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Историчность при загрузке таблицы (СУБД: Teradata)
4 сообщений из 4, страница 1 из 1
Историчность при загрузке таблицы (СУБД: Teradata)
    #37708371
Новичок_я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Нужна помощь в написании запроса. Текст как таковой не нужен, хочу направление, куда копать.
Есть таблица Тrgt, в которой реализована историчность с помощью двух полей StartDt и EndDt, которые показывают период актуальности записи. Есть нюанс: у записи нет первичного ключа, поэтому реализована так называемая блочная историчность: у набора записей есть идентификатор ID_Block, при загрузке очередных данных проверяю, были ли изменения целиком в блоке, если были, то существующий блок закрывается (в поле EndDt записывается ДатаЗагрузки - 1 день), и новый блок с заданным идентификатором открывается. Запрос, который определяет изменения в блоке, в аттаче (Тrgt - существующая таблица, L - таблица с новыми данными. Ежедневно в таблице L приходят данные за один день. Запрос упрощен, если понадобится пояснения, сделаю).
Загрузка в Тrgt таблицу происходит ежедневно, и загружается новая порция данных за один день, блочная историчность реализована и работает.
Теперь новая задача: надо грузить данные не по дням, а массово - за один год, например, и историчность в этом случае придется строить на лету. То есть в таблицу L загрузили данные сразу за год, а в таблицу Тrgt должны попасть данные с построенной историчностью. Моя проблема заключается в том, что оператор MINUS ALL в запросе оперирует независимыми множествами, а в случае построения истории он должен проверять изменения с прошлого дня, то есть ДанныеЗаТекущийДень MINUS ALL ДанныеЗаПрошлыйДень.
Как это можно реализовать?

Буду признателен за любые советы.
Спасибо!

Запросы прикладываю
ID - суррогатный PK, ID_Block - идентификатор блока, Value1 - значение, которое меняется в блоке. BlockOrder - это фактически поле StartDt, показывает, в каком порядке пришел блок.

Код: 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.
27.
28.
29.
30.
CREATE SET TABLE Query_Tst ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT,
     DEFAULT MERGEBLOCKRATIO
     (
     ID int,
      ID_Block int NOT NULL,
      Value1 int,
      BlockOrder SMALLINT
)
PRIMARY INDEX (ID);

insert into Query_Tst values (1, 1, 15, 10);
insert into Query_Tst values (2, 1, 25, 10);
insert into Query_Tst values (3, 1, 35, 10);
insert into Query_Tst values (4, 22, 101, 11);
insert into Query_Tst values (5, 22, 121, 11);
insert into Query_Tst values (6, 22, 25, 11);
insert into Query_Tst values (7, 22, 141, 11);
insert into Query_Tst values (8, 15, 101, 12);
insert into Query_Tst values (9, 15, 121, 12);
insert into Query_Tst values (10, 15, 72, 12);
insert into Query_Tst values (11, 15, 72, 12);
insert into Query_Tst values (12, 35, 72, 13);
insert into Query_Tst values (13, 35, 172, 13);
insert into Query_Tst values (14, 35, 101, 13);
insert into Query_Tst values (15, 35, 72, 13);
insert into Query_Tst values (16, 35, 72, 13);
insert into Query_Tst values (17, 35, 72, 13);



Запрос, который определяет разницу в двух смежных блоках (Текущий минус предыдущий. Сравнивается всегда последний пришедший в Trgt блок)

Код: 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.
27.
28.
29.
30.
31.
32.
SELECT ID_Block FROM 
(SELECT
	ID_Block,
	Value1
FROM Trgt
WHERE ID_Block = _ПоследнийКодБлока_

MINUS  ALL

SELECT
	ID_Block,
	Value1
FROM L) Trgt_L

UNION

SELECT ID_Block FROM 
(SELECT
	ID_Block,
	Value1
FROM L

MINUS  ALL

SELECT
	ID_Block,
	Value1
FROM Trgt
WHERE ID_Block = _ПоследнийКодБлока_
) L_Trgt

GROUP BY 1
...
Рейтинг: 0 / 0
Историчность при загрузке таблицы (СУБД: Teradata)
    #37781862
YURKA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо бы озвучивать версию Терадаты.В 12, 13 или 13.10 возможны ньюансы.
Возможно я не совсем до конца понял задачу при загрузке историчности за год.
Но может можно будет через RECURSION VIEW генерить нужный идентификатор для ID_Block.
В документации по Терадате это достаточно подробно описанно.Покопай в эту сторону.
И ещё, при загрузке больших обьёмов в целевую таблицу созданную через CREATE SET TABLE будут тормоза.
Спул будет рости из-за проверки на уникальность записей.Может есть возможность CREATE MULTISET TABLE.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Историчность при загрузке таблицы (СУБД: Teradata)
    #38323385
pectopatop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не до конца вкурил, но
"А может год пришедший бить на дни и в цикле прогонять?"
(Да и задача уже решена наверняка... Кстати как?)
...
Рейтинг: 0 / 0
Историчность при загрузке таблицы (СУБД: Teradata)
    #38324981
Павел Новокшонов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для такого рода задач с поддержкой историчности данных в принципе подходят Temporal таблицы, доступные начиная с версии 13.10. В доке есть Temporal Table support guide.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Другие СУБД [игнор отключен] [закрыт для гостей] / Историчность при загрузке таблицы (СУБД: Teradata)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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