我需要查询方面的帮助来处理以下情况。
以下记录处于活动状态:
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"行。 这是你所期待的还是不是?