【发布时间】:2015-10-23 10:27:54
【问题描述】:
我有一张表,表示责任期,类似于以下内容:
Key Resp_Key Start_Date End_Date
1 150 2015-01-01 2015-01-25
2 150 2015-01-25 2015-02-15
3 200 2015-02-15 2015-03-01
4 150 2015-03-01 2015-04-30
5 150 2015-04-30 NULL
当某人当前负责时,End_Date 列是NULL。对于上面的例子,Resp_Key150 的一方自 3 月 1 日起负责(其他列可能在 4 月 30 日发生了变化,导致为该日期创建了另一条记录,但这些对于这个问题并不重要)。
我需要创建一个查询来查找连接到当前期间和Resp_Key 的所有连续记录。在上面的例子中,查询应该返回记录 4 和 5,因为记录 5 是当前期间,并且记录 4 与之相连(因为记录 4 的 End_Date 是记录 5 的 Start_Date,它们都有相同Resp_Key)。不会包括记录 3,因为 Resp_Key 不同,并且记录 1 和 2 也不会包括在内,因为它们与当前记录不连续。
如果进行了以下更改/添加:
Key Resp_Key Start_Date End_Date
5 150 2015-04-30 2015-05-31
6 231 2015-05-31 2015-06-30
7 150 2015-06-30 NULL
查询应该只返回记录 7,因为它是当前记录,并且紧接在它之前的时间段有不同的 Resp_Key。
我一直在尝试编写 CTE 来处理此问题,但我不确定这是正确的工具。递归 CTE 是有意义的,因为我无法事先知道有多少记录是我感兴趣的连续周期的一部分。但我编写的 CTE 告诉我不能使用 LEFT JOIN,而我没有对于只有一个记录在最近连续周期的情况,不知道如何解决对它的需求。
;WITH ContinuousPeriod
AS (
-- Current Period and key of immediately preceding period
SELECT Current.Key, Current.Start_Date, Current.End_Date, Previous.Key AS PrevKey
FROM PeriodTable AS Current
LEFT JOIN PeriodTable AS Previous
ON Previous.End_Date = Current.Start_Date
AND Previous.Resp_Key = Current.Resp_Key
WHERE Current.PEVNT_END_DATE IS NULL
UNION ALL
. . .
有什么建议吗?
【问题讨论】:
标签: sql sql-server-2008 recursive-query