更正历史数据
Correct history data
我有一个场景,我必须更正历史数据。目前数据如下:
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。因此,如果其中任何一个更改了历史记录,则应将下一条记录的开始日期作为上一条记录的结束日期来处理。
这里两条记录都是打开的,这是不正确的。
请建议如何处理这两种情况。
谢谢。
您的历史记录行在 table 中是如何排序的?换句话说,您如何决定比较哪些历史记录行以查看值是否已更改?以及如何唯一标识历史记录行条目?
例如,如果您按 start_dt 对历史记录行进行排序,则可以使用 window 函数比较之前和当前行的值,如 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 系统,因此您可能还需要使用 table 别名。您可能还需要处理边缘情况(即 table 中的 first/last 行)。
我有一个场景,我必须更正历史数据。目前数据如下:
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。因此,如果其中任何一个更改了历史记录,则应将下一条记录的开始日期作为上一条记录的结束日期来处理。
这里两条记录都是打开的,这是不正确的。 请建议如何处理这两种情况。
谢谢。
您的历史记录行在 table 中是如何排序的?换句话说,您如何决定比较哪些历史记录行以查看值是否已更改?以及如何唯一标识历史记录行条目?
例如,如果您按 start_dt 对历史记录行进行排序,则可以使用 window 函数比较之前和当前行的值,如 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 系统,因此您可能还需要使用 table 别名。您可能还需要处理边缘情况(即 table 中的 first/last 行)。