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



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

╔═════════════╦════════════╦════════════╗
║ 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 Server,因此目标之一是解决其中任何一个!

附言您将看到第 2 行和第 3 数据行具有相同的开始日期。这两者之间的重叠顺序是任意的;它们可以是任何一种方式。

编辑:更改了示例数据集,使其涵盖了新的突出显示的可能性。"重叠顺序"列可以从 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

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

演示

最新更新