鉴于MS SQL Server 2012中的一个数据集,其中旅行者出行(trip_ID为UID),并且每次旅行都有start_date和end_date,我希望找到每个旅行者的Trip_ID,其中旅行的重叠部分和范围重叠。因此,如果初始表如下所示:
| trip_ID | traveler | start_date | end_date | trip_length |
|---------|----------|------------|------------|-------------|
| AB24 | Alpha | 2017-01-29 | 2017-01-31 | 2|
| BA02 | Alpha | 2017-01-31 | 2017-02-10 | 10|
| CB82 | Charlie | 2017-02-20 | 2017-02-23 | 3|
| CA29 | Bravo | 2017-02-26 | 2017-02-28 | 2|
| AB14 | Charlie | 2017-03-06 | 2017-03-08 | 2|
| DA45 | Bravo | 2017-03-26 | 2017-03-29 | 3|
| BA22 | Bravo | 2017-03-29 | 2017-04-03 | 5|
我正在寻找一个查询,该查询会将三列附加到原始表中:overlap_id,overlap_start,overlap_end。这个想法是,每行都将有一个重叠行程的值(或NULL)以及重叠本身的开始和结束日期。像这样:
| trip_ID | traveler | start_date | end_date |trip_length|overlap_id |overlap_start| overlap_end|
|---------|----------|------------|------------|-----------|------------|-------------|------------|
| AB24 | Alpha | 2017-01-29 | 2017-01-31 | 2|BA02--------|2017-01-31---|2017-01-31--|
| BA02 | Alpha | 2017-01-31 | 2017-02-10 | 10|AB24--------|2017-01-31---|2017-01-31--|
| CB82 | Charlie | 2017-02-20 | 2017-02-23 | 3|NULL--------|NULL---------|NULL--------|
| CA29 | Bravo | 2017-02-26 | 2017-02-28 | 2|NULL--------|NULL---------|NULL--------|
| AB14 | Charlie | 2017-03-06 | 2017-03-08 | 2|NULL--------|NULL---------|NULL--------|
| DA45 | Bravo | 2017-03-26 | 2017-03-29 | 3|BA22--------|2017-03-28---|2017-03-29--|
| BA22 | Bravo | 2017-03-28 | 2017-04-03 | 5|DA45--------|2017-03-28---|2017-03-29--|
我尝试使用Overlapping Dates in SQL的变体来告知我的方法,但未返回正确的答案。我只是在寻找同一位旅行者的重叠(即在Alpha或Bravo内部,而不是Alpha和Bravo之间)。
对于overlay_id列,我认为代码将必须测试行程的start_date加上range(0,trip_length)是否返回介于旅行者相同的任何其他行程的start_date和end_date之间的日期范围内的值,然后将trip_id更新为等于匹配行程的id。如果这是正确的概念,则我不确定如何从trip_length中获取一个变量,因此我将对其进行测试以测试其值的范围,即,对trip_length-x的所有值运行该值,直到trip_length-x = 0。 >
--This might be the bare bones of an answer
update table
set overlap_id = CASE
WHEN ( DATEADD(day, trip_length, start_date) = SELECT (DATEADD(day, trip_length, start_date) from table where traveler = traveler)