历史记录处理方案问题



我需要查询方面的帮助来处理以下情况。

以下记录处于活动状态:

ID          start_dt        status  end_dt
-------------------------------------------------
18,593,122  1/15/07 14:38   A       12/11/07 8:45
18,593,122  12/11/07 8:45   C       12/11/07 8:45
18,593,122  12/11/07 8:45   A       11/13/11 0:00
18,593,122  11/13/11 0:00   C       12/26/11 10:36
18,593,122  12/26/11 10:36  A       ?

以下已关闭:

ID          start_dt        status  end_dt
-------------------------------------------------
18,593,122  1/15/07 14:38   A       12/11/07 8:45
18,593,122  12/11/07 8:45   C       ?

我必须在记录未正确结束的表中插入记录。 例如,有如下记录:

ID          start_dt        status  end_dt
-------------------------------------------------
18,593,122  1/15/07 14:38   A       12/11/07 8:45

在上述记录中,缺少"已关闭"记录。

我必须确定这些记录并插入表格。

下面的样本受到影响。

10,866  7/29/96 0:01    A       12/27/03 14:16
10,866  7/25/00 0:01    A       8/20/00 23:59
10,866  8/20/00 23:59   C       10/2/02 13:00
10,866  10/2/02 13:00   A       7/25/04 14:11
10,866  12/27/03 14:16  C       7/25/04 14:11
10,866  7/25/04 14:11   C       7/25/04 14:11
10,866  7/25/04 14:11   A       ?
10,866  5/28/11 16:24   T       5/28/11 16:24

以下方案无法处理:accs_meth_status_type_cd='A' 且结束日期不为空的记录(下面突出显示)。 预期:应插入 accs_meth_status_type_cd='C' 的记录 实际:未插入 accs_meth_status_type_cd='C' 的记录

10,866  7/29/96 0:01    A       12/27/03 14:16
10,866  7/25/00 0:01    A       8/20/00 23:59
10,866  8/20/00 23:59   C       10/2/02 13:00
10,866  10/2/02 13:00   A       7/25/04 14:11
10,866  12/15/04 14:16  A       ?

据我了解,正确关闭的记录(即ID)包括:

  • 行 #1:"C"<>状态,End_Dt不为空
  • 行 #2:状态 ="C",End_Dt为空
  • 行 #1 中的End_Dt = 行 #2 中的Start_Dt

假设这是正确的,您可以执行以下操作来查找应关闭的记录(即具有第 #1 行,但缺少第 #2 行):

INSERT INTO mytbl (ID, Start_Dt, Status, End_Dt)
SELECT 
a.ID, 
a.End_Dt, -- Use the unclosed row's End_Dt as the Start_Dt for the new "to-be-inserted" row
'C', 
NULL
FROM mytbl a
WHERE a.status <> 'C' 
AND a.End_Dt IS NOT NULL -- Get rows that should be considered closed
AND (a.ID, a.End_Dt) NOT IN (
-- Check for corresponding records that do not also have a 'C' row
-- You can also do this as a LEFT JOIN above
SELECT ID, Start_Dt 
FROM mytbl 
WHERE Status = 'C' -- Check for presence of 'C' rows
AND End_Dt IS NULL -- Check
)
QUALIFY ROW_NUMBER() OVER(PARTITION BY a.ID ORDER BY End_Dt DESC) = 1 -- Only return one row per "unclosed" record
;

这不会处理所有边缘情况,但它应该让你开始。 让我知道这是否是你要找的。

更新后
,我针对您提供的 5 个新行运行了上面的查询,这是我得到的结果:

id      start_dt                    status  end_dt
1   10,866  7/25/2000 00:01:00.000000   A       8/20/2000 23:59:00.000000
2   10,866  8/20/2000 23:59:00.000000   C       10/2/2002 13:00:00.000000
3   10,866  7/29/1996 00:01:00.000000   A       12/27/2003 14:16:00.000000
4   10,866  10/2/2002 13:00:00.000000   A       7/25/2004 14:11:00.000000
5   10,866  12/27/2003 14:16:00.000000  A       ?
6   10,866  7/25/2004 14:11:00.000000   C       ?

行#1-5 是原始行。 行 #6 是新插入的"C"行,对应于行 #4,旧的未正确关闭的"A"行。 这是你所期待的还是不是?

相关内容

最新更新