首页 > 解决方案 > 清理 Teradata 临时表中的错误删除/插入

问题描述

寻找一种方法来清理多年来发生错误删除/插入的临时表中的一些数据。当周期值重叠/满足时,我能够使用 NORMALIZE,但是,我现在遇到了周期不重叠/满足的问题。我想巩固这些时期。

前: 前

后: 后

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

分组思路: 分组理念

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

谢谢!

标签: sqlteradata

解决方案


由于我对您的帖子的评论中指出的原因,这是未经测试的。

它使用称为间隙和孤岛的概念来识别值保持不变的连续记录。这些在最终图像中形成您的“组”。

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))

推荐阅读