【发布时间】:2012-08-29 12:27:01
【问题描述】:
我一直在做以下工作,但没有得到任何结果,而且截止日期很快就要到了。此外,还有超过一百万行,如下所示。感谢您对以下内容的帮助。
目标:按成员对结果进行分组,并通过组合各个日期范围来为每个成员构建连续覆盖范围,这些日期范围可以重叠或彼此连续运行,并且在范围的开始和结束日期之间没有中断。
我有以下格式的数据:
MemberCode ----- ClaimID ----- StartDate ----- EndDate
00001 ----- 012345 ----- 2010-01-15 ----- 2010-01-20
00001 ----- 012350 ----- 2010-01-19 ----- 2010-01-22
00001 ----- 012352 ----- 2010-01-20 ----- 2010-01-25
00001 ----- 012355 ----- 2010-01-26 ----- 2010-01-30
00002 ----- 012357 ----- 2010-01-20 ----- 2010-01-25
00002 ----- 012359 ----- 2010-01-30 ----- 2010-02-05
00002 ----- 012360 ----- 2010-02-04 ----- 2010-02-15
00003 ----- 012365 ----- 2010-02-15 ----- 2010-02-30
...
上述成员 (00001) 是有效成员,因为从 2010-01-15 到 连续的日期范围 2010-01-30(没有间隙)。请注意,此成员的声明 ID 012355 紧邻声明 ID 012352 的结束日期开始。这仍然有效,因为它形成了一个连续的范围。
但是,会员 (00002) 应该是无效会员,因为索赔 ID 012357 的结束日期和索赔 ID 的开始日期之间有 5 天的间隔强>012359
我想要做的是只列出那些在连续日期范围(对于每个成员)的每一天都有声明的成员的列表,在 MIN(开始日期)和 Max(结束日期)之间没有间隙) 对于每个 Distinct 成员。有差距的成员将被丢弃。
提前致谢。
更新:
我已经到了这里。
注:FILLED_DT = Start Date & PresCoverEndDT = End Date
SELECT PresCoverEndDT, FILLED_DT
FROM
(
SELECT DISTINCT FILLED_DT, ROW_NUMBER() OVER (ORDER BY FILLED_DT) RN
FROM Temp_Claims_PRIOR_STEP_5 T1
WHERE NOT EXISTS
(SELECT * FROM Temp_Claims_PRIOR_STEP_5 T2
WHERE T1.FILLED_DT > T2.FILLED_DT AND T1.FILLED_DT< T2.PresCoverEndDT
AND T1.MBR_KEY = T2.MBR_KEY )
) T1
JOIN (SELECT DISTINCT PresCoverEndDT, ROW_NUMBER() OVER (ORDER BY PresCoverEndDT) RN
FROM Temp_Claims_PRIOR_STEP_5 T1
WHERE NOT EXISTS
(SELECT * FROM Temp_Claims_PRIOR_STEP_5 T2
WHERE T1.PresCoverEndDT > T2.FILLED_DT AND T1.PresCoverEndDT < T2.PresCoverEndDT AND T1.MBR_KEY = T2.MBR_KEY )
) T2
ON T1.RN - 1 = T2.RN
WHERE PresCoverEndDT < FILLED_DT
上面的代码似乎有错误,因为我只得到一行,而且它也不正确。我想要的输出只有 1 列,如下所示:
Valid_Member_Code
00001
00007
00009
...等等,
【问题讨论】:
-
@Chris Gessler - 抱歉,如果以下问题很幼稚。但是,我的要求是针对每个不同的成员。如何使用链接中的步骤查找每个不同成员的日期范围?谢谢。
-
@Vijay - 如果您想查找无效的会员代码,您可以自行加入并查找 t1.EndDate > t2.StartDate。要查找所有日期间隔,您必须对结果进行分区。您是否偶然使用 SQL Server?
标签: sql-server-2008 tsql gaps-and-islands