清理 Teradata 时态表中的错误 Delete/Inserts

Cleaning up bad Delete/Inserts in Teradata Temporal Tables

希望找到一种方法来清理一段时间内 table 的一些数据,而这些年来 Deletes/Inserts 一直都在发生坏事。当周期值 overlapped/met 时,我能够使用 NORMALIZE,但是,我现在 运行 遇到周期不 overlap/meet 的问题。我想合并期间。

之前:

之后:

我最初的计划是采用 min(begin(eff_vt_dttm)) 和 max(end(eff_vt_dttm)) 并在按所有列分组后创建一个新的时间段。问题是行值重复的边缘情况,例如第 1 行和第 2 行应该合并,但不希望第 5 行和第 6 行与第 1 行和第 2 行合并。第 1 行和第 2 行应该合并到它们自己的行,第 5 行和 6 也应该合并到他们自己的行中。我正在考虑创建分组,以便我可以占据该组的 min/max,但遇到了困难。

分组思路:

想知道是否有人知道解决这个问题的好方法。

谢谢!

由于我对您的评论中提到的原因 post,这是未经测试的。

它使用称为间隙和孤岛的概念来识别值保持不变的连续记录。这些构成了最终图像中的你'groups'。

WITH
  sorted AS
(
  SELECT
    your_data.*,
    ROW_NUMBER() OVER (PARTITION BY id
                           ORDER BY BEGIN(eff_vt_dttm)
                      )
                        AS seq_num_id,
    ROW_NUMBER() OVER (PARTITION BY id, col1, col2
                           ORDER BY BEGIN(eff_vt_dttm)
                      )
                        AS seq_num_id_col1_col2
  FROM
    your_data
)
SELECT
  s.id,
  s.col1,
  s.col2,
  PERIOD(
    MIN(begin(s.eff_vt_dttm)),
    MAX(end(s.eff_vt_dttm))
  )
    AS eff_vt_dttm
FROM
  sorted  AS s
GROUP BY
  s.id,
  s.col1,
  s.col2,
  s.seq_num_id - s.seq_num_id_col1_col2
ORDER BY
  s.id,
  MIN(begin(s.eff_vt_dttm))