Teradata Max per Partition with non-adjacent duplicates

Teradata Max per Partition with non-adjacent duplicates

好吧,这个可能有点棘手,所以让我从视觉开始。

数据如下: Original Data From Source

我正在尝试将其简化为如下所示: End Result that I'm working towards

问题是我有一名员工变回了以前的经理,所以当我尝试对数据进行分区和分组时,这两个实例合并在一起,最终得到的数据如下所示: Actual Results

在上图中,我们可以看到汤姆经理的开始日期和结束日期在鲍勃经理的开始日期和结束日期之内,这是一个错误。关于如何隔离稍后重新引入的项目的分组的任何建议?我相信这将由开始日期和分区排名决定,但我似乎无法让它发挥作用。

这是构建示例数据的查询:

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

假设您最后一次插入有评论中提到的拼写错误,您可以使用 Teradata 的 Period 数据类型(和函数)来使这个超级简单:

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

这是根据 record_startrecord_end 日期构造一个 PERIOD 列类型。然后我们使用 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) |
+----------+---------+----------+--------------------------+