SQL 中重叠日期范围的计数顺序

Count order of overlapping date ranges in SQL

我不确定标题是否描绘了正确的画面,但我会尝试解释。我有一个包含开始和结束日期以及团队成员 ID(有点像项目)的 table。我需要确定它们何时重叠,计算重叠的数量,并确定重叠的顺序(按开始日期排序)。我的虚拟数据应该澄清,但它是我真正想要的 3 个中的后者。这是我目前的 table:

╔═════════════╦════════════╦════════════╗
║ Team Member ║ Start Date ║  End Date  ║
╠═════════════╬════════════╬════════════╣
║           1 ║ 01/01/2015 ║ 04/01/2015 ║
║           1 ║ 04/01/2015 ║ 06/01/2015 ║
║           1 ║ 06/01/2015 ║ 07/01/2015 ║
║           2 ║ 04/01/2015 ║ 06/01/2015 ║
║           2 ║ 06/01/2015 ║ 10/01/2015 ║
║           3 ║ 01/01/2015 ║ 09/01/2015 ║
║           3 ║ 11/01/2015 ║ 13/01/2015 ║
╚═════════════╩════════════╩════════════╝

这就是我想要的:

╔══════════════╦═════════════╦════════════╦════════════╗
║ OverlapOrder ║ Team Member ║ Start Date ║  End Date  ║
╠══════════════╬═════════════╬════════════╬════════════╣
║            0 ║           1 ║ 01/01/2015 ║ 04/01/2015 ║
║            1 ║           1 ║ 04/01/2015 ║ 06/01/2015 ║
║            0 ║           1 ║ 06/01/2015 ║ 07/01/2015 ║
║            0 ║           2 ║ 04/01/2015 ║ 06/01/2015 ║
║            1 ║           2 ║ 06/01/2015 ║ 10/01/2015 ║
║            0 ║           3 ║ 01/01/2015 ║ 09/01/2015 ║
║            0 ║           3 ║ 11/01/2015 ║ 13/01/2015 ║
╚══════════════╩═════════════╩════════════╩════════════╝

所以你可以看到团队成员不应该影响彼此的重叠顺序。

我目前正在使用 Access SQL,但很快就会转移到 SQL 服务器,因此目标是解决其中任何一个问题!

P.S。您会看到第二个和第三个数据行具有相同的开始日期。这两者之间的重叠顺序是任意的;他们可以是任何一种方式。

编辑:更改了示例数据集,使其涵盖了一个新的突出显示的可能性。 OverlapOrder 列可以从 0 到任意高,具体取决于有多少项目重叠。

假设您能够迁移到 SQL Server 2005 或更高版本,您可以尝试以下使用 CTE 执行您想要的操作的解决方案:

;with cte as
(select *, row_number() over (partition by id order by startdate, enddate) rn
 from tbl)
select *, case when (datediff(dd,s.startdate,t.enddate) >= 0) then s.rn - 1 else 0 end
from cte s
left join cte t on s.id = t.id and t.rn = s.rn - 1

但是,您应该对此持保留态度,因为此解决方案很可能是专门针对样本数据集设计的。我还没有用不同的案例进行测试。

Demo