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

时间:2015-01-09 09:20:07

标签: sql sql-server date ms-access

我不确定标题是否描绘了正确的图片,但我会尝试解释。我有一个包含开始和结束日期的表,以及团队成员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,因此目标中的任何一个都是解决方案!

P.S。您会看到第2和第3个数据行具有相同的开始日期。这两者之间的重叠顺序是任意的;它们可以是圆形的。

编辑:更改了样本数据集,因此它涵盖了新突出显示的可能性。 OverlapOrder列可以从0变为高但取决于项目重叠的数量。

1 个答案:

答案 0 :(得分:2)

假设您能够迁移到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