【问题标题】:Teradata Max per Partition with non-adjacent duplicates每个分区的 Teradata Max 具有不相邻的重复项
【发布时间】:2020-01-18 04:57:30
【问题描述】:

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

数据如下所示: Original Data From Source

我正在尝试简化它,使其看起来像这样: End Result that I'm working towards

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

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

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

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

【问题讨论】:

  • 通常我会对此使用 normalize,但您的 Bob S 和 Mike B 的记录与该组合的所有其他记录重叠,从 2019-01-15 到 9999-12- 31.换句话说,我会说你的实际结果是正确的。
  • 我猜最后一条记录应该是INSERT INTO vt_agent VALUES(12345678, 'Bob S.', 'Mike B.', '2020-01-15', '9999-12-31');?
  • 是的,2019-01-15 是一个错字。我手动重新输入了一些数据以进一步简化示例数据并犯了人为错误,好眼力!然而,非拼写数据存在问题。

标签: duplicates teradata partition


【解决方案1】:

假设您上次插入的内容有 cmets 中提到的拼写错误,您可以利用 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) |
+----------+---------+----------+--------------------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2019-05-16
    • 2015-11-29
    • 2018-11-28
    • 2016-02-05
    • 2023-01-02
    相关资源
    最近更新 更多