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

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


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