Алгоритм "Натягивание" (Pull Story)
Часто встречает ситуация когда надо от истории по 2 и более ключам перейти к истории по меньшему количеству ключей. Для получения новой истории используется так называемый метод "натягивания" (pull story). Смысл в том что мы сначало строим временную шкалу в нашем примере hist_table_time по нужному ключу. Потом соединяем временную шкалу с таблицей на момент времени (т.е. на eff_dttm из шкалы времени) и получаем нужные нам поля различными аггрегирующими функциями (в нашем примере это MAX)
Данный алгоритм может применяться и для натягивания нескольких таблиц на общую временную шкалу которую можно получить через UNION.
Данный алгоритм может применяться и для натягивания нескольких таблиц на общую временную шкалу которую можно получить через UNION.
WITH
--таблица с историей и ключом из двух полей
hist_table AS
(SELECT 1 AS key1, 1 key2, DATE '2010-01-01' AS eff_dttm, DATE '2011-01-01' AS exp_dttm FROM dual UNION
SELECT 1 AS key1, 1 key2, DATE '2011-01-01' AS eff_dttm, DATE '2999-12-31' AS exp_dttm FROM dual UNION
SELECT 1 AS key1, 3 key2, DATE '2010-01-01' AS eff_dttm, DATE '2999-12-31' AS exp_dttm FROM dual UNION
SELECT 2 AS key1, 4 key2, DATE '2012-01-01' AS eff_dttm, DATE '2999-12-31' AS exp_dttm FROM dual),
--временная шкала с ключом из одного поля
hist_table_time AS
(SELECT DISTINCT
key1,
eff_dttm,
NVL(LEAD(eff_dttm) OVER(PARTITION BY key1 ORDER BY eff_dttm),DATE '2999-12-31') AS exp_dttm
FROM
hist_table)
--
SELECT
t.key1,
MAX(t.key2) AS val2,
tm.eff_dttm,
tm.exp_dttm
FROM
hist_table t,
hist_table_time tm
WHERE
t.key1=tm.key1
AND tm.eff_dttm >= t.eff_dttm
AND tm.eff_dttm < t.exp_dttm
AND tm.eff_dttm < tm.exp_dttm
GROUP BY
t.key1,
tm.eff_dttm,
tm.exp_dttm;
В результате получим:
| KEY1 | VAL2 | EFF_DTTM | EXP_DTTM | |
|---|---|---|---|---|
| 2 | 1 | 3 | 01.01.2010 | 01.01.2011 |
| 1 | 1 | 3 | 01.01.2011 | 31.12.2999 |
| 3 | 2 | 4 | 01.01.2012 | 31.12.2999 |
Комментарии
Отправить комментарий