【问题标题】:Correct history data正确的历史数据
【发布时间】:2018-06-24 17:29:14
【问题描述】:

我有一个场景,我必须更正历史数据。当前数据如下:

Status_cd   event_id    phase_cd    start_dt    end_dt
110         23456        30         1/1/2017    ?
110         23456        31         1/2/2017    ?


Status_cd   event_id    phase_cd    start_dt    end_dt
110           23456      30          1/1/2017   ?
111           23456      30          1/2/2017   ?

主要的列是 status_cd 和 phase_cd。因此,如果其中任何一个更改历史记录,则应以下一条记录的开始日期作为上一条记录的结束日期来处理。

这里两个记录都是打开的,这是不正确的。 请就如何处理这两种情况提出建议。

谢谢。

【问题讨论】:

标签: teradata


【解决方案1】:

您的历史记录行在表格中是如何排序的?换句话说,您如何决定要比较哪些历史记录行以查看值是否已更改?以及如何唯一标识历史记录行条目?

例如,如果您按 start_dt 对历史记录行进行排序,您可以使用窗口函数比较前一行和当前行的值,就像 Rob 建议的那样:

UPDATE MyHistoryTable
FROM (
    -- Get source history rows that need to be updated
    SELECT 
        history_row_id, -- Change this field to match your table
        MAX(status_cd) OVER(ORDER BY start_dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS status_cd_next, -- Get "status_cd" value for "next" history row
        MAX(phase_cd) OVER(ORDER BY start_dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS phase_cd_next,
        MAX(start_dt) OVER(ORDER BY start_dt ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING) AS start_dt_next
    FROM MyHistoryTable
    WHERE status_cd <> status_cd_next -- Check "status_cd" values are different
    OR phase_cd <> phase_cd_next -- Check "phase_cd" values are different
) src
SET MyHistoryTable.end_dt = src.start_dt_next -- Update "end_dt" value of current history row to be "start_dt" value of next history row
WHERE MyHistoryTable.history_row_id = src.history_row_id -- Match source rows to target rows

这假设您有一个列来唯一标识每个历史记录行,称为“history_row_id”。试试看,然后告诉我。

我没有要测试的 TD 系统,因此您可能还需要对表别名进行处理。您可能还需要处理边缘情况(即表中的第一行/最后一行)。

【讨论】:

  • 非常感谢馄饨。我会检查并告诉你。
猜你喜欢
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2018-10-11
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多