Teradata Max на раздел с несмежными дубликатами - PullRequest
0 голосов
/ 17 января 2020

Хорошо, этот может быть немного хитрым, поэтому позвольте мне начать с визуального.

Вот как выглядят данные: Исходные данные из источника

Я пытаюсь упростить это так, чтобы это выглядело так: Конечный результат, к которому я стремлюсь

Проблема в том, что у меня есть сотрудник, который сменил прежнего менеджера, поэтому, когда я пытаюсь разделить и сгруппировать данные, эти два экземпляра объединяются, и я получаю данные, которые выглядят следующим образом: Фактические результаты

На изображении выше мы видим, что У менеджера Тома есть даты начала и окончания, которые находятся в пределах даты начала и конца менеджера Боба, что является ошибкой. Любые предложения о том, как изолировать группировку предмета, который будет повторно введен позже? Я полагаю, что это будет определяться датой начала и ранжированием раздела, но я не могу заставить его работать.

Вот запрос для построения примера данных:

CREATE VOLATILE TABLE VT_AGENT
( 
EmpID INT
,Manager VARCHAR(16)
,Director VARCHAR(16)
,Record_Start DATE
,Record_End DATE
)  ON COMMIT PRESERVE ROWS;

INSERT INTO vt_agent VALUES(12345678, 'Jill M.', 'Mike B.', '2019-08-21', '2019-09-07');
INSERT INTO vt_agent VALUES(12345678, 'Jill M.', 'Mike B.', '2019-09-07', '2019-09-16');
INSERT INTO vt_agent VALUES(12345678, 'Bob S.', 'Mike B.', '2019-09-16', '2019-10-15');
INSERT INTO vt_agent VALUES(12345678, 'Bob S.', 'Mike B.', '2019-10-15', '2019-11-23');
INSERT INTO vt_agent VALUES(12345678, 'Tom A.', 'Mike B.', '2019-11-23', '2019-12-07');
INSERT INTO vt_agent VALUES(12345678, 'Tom A.', 'Mike B.', '2019-12-07', '2019-12-12');
INSERT INTO vt_agent VALUES(12345678, 'Bob S.', 'Mike B.', '2019-12-12', '2020-01-15');
INSERT INTO vt_agent VALUES(12345678, 'Bob S.', 'Mike B.', '2020-01-15', '9999-12-31');

Select * FROM VT_AGENT

1 Ответ

1 голос
/ 17 января 2020

Предполагая, что ваша последняя вставка содержала опечатки, упомянутые в комментариях, вы можете использовать тип данных Teradata's Period (и функции), чтобы сделать это очень простым:

SELECT NORMALIZE 
   empid, 
   manager, 
   directory, 
   PERIOD(record_start, record_end) as valid_period 
FROM VT_AGENT;

Что это делает, это создает Тип столбца PERIOD из дат record_start и record_end. Затем мы используем ключевое слово NORMALIZE для сжатия периодов, когда все другие столбцы без периодов совпадают в нескольких записях. Результатом является одна запись с расширенным периодом. Это работает только тогда, когда периоды в этих совпадающих записях встречаются (конец одного останавливается в начале следующего) или перекрывается (конец одного - после начала следующего).

С исправленной предполагаемой опечаткой это выдает:

+----------+---------+----------+--------------------------+
|  EmpID   | Manager | Director |       valid_period       |
+----------+---------+----------+--------------------------+
| 12345678 | Bob S.  | Mike B.  | (2019-09-16, 2019-11-23) |
| 12345678 | Bob S.  | Mike B.  | (2019-12-12, 9999-12-31) |
| 12345678 | Jill M. | Mike B.  | (2019-08-21, 2019-09-16) |
| 12345678 | Tom A.  | Mike B.  | (2019-11-23, 2019-12-12) |
+----------+---------+----------+--------------------------+
...