我怎样才能只合并随后发生的日期。?
(即,下一个事件在前一个事件完成后立即开始)。
在这里,我们还需要考虑其他一些列来获取输出。
这是示例事件甘特图的附加屏幕截图。 下表包含事件(分别为 M_ID、Y_ID、T_ID、E_ID、BeginDate、EndDate)
CREATE TABLE #EventTable
(
M_ID INT,
Y_ID INT,
T_ID INT,
E_ID INT,
BeginDate DATE,
EndDate DATE
);
下面的插入语句用于示例数据设置。
INSERT INTO #EventTable
VALUES
(135709, 2, 7, 1, '01 Jan 2017', '31 Mar 2017'),
(135709, 2, 7, 1, '01 Apr 2017', '30 Jun 2017'),
(135709, 2, 7, 3, '01 Jan 2017', '31 Jan 2017'),
(135709, 2, 7, 3, '01 Feb 2017', '30 Apr 2017'),
(135709, 2, 7, 3, '01 May 2017', '31 May 2017'),
(135709, 2, 7, 3, '01 Jul 2017', '31 Aug 2017'),
(135709, 2, 7, 3, '01 Oct 2017', '31 Oct 2017'),
(135709, 2, 7, 3, '01 Dec 2017', '31 Dec 2017'),
(135709, 5, 8, 1, '01 Feb 2017', '30 Apr 2017'),
(135709, 5, 8, 1, '01 Apr 2017', '31 Jul 2017'),
(134560, 5, 8, 3, '01 Apr 2017', '31 Aug 2017'),
(134560, 5, 8, 3, '01 May 2017', '31 Aug 2017'),
(134560, 5, 8, 3, '01 Oct 2017', '31 Oct 2017'),
(134560, 5, 8, 3, '01 Nov 2017', '30 Nov 2017'),
(135678, 3, 6, 2, '01 Jan 2017', '31 Mar 2017'),
(135678, 3, 6, 2, '01 Apr 2017', '30 Jun 2017'),
(135678, 3, 6, 2, '01 Oct 2017', '31 Oct 2017'),
(135678, 3, 6, 2, '01 Nov 2017', '31 Dec 2017'),
(123457, 4, 2, 3, '01 May 2017', '31 Oct 2017');
例子:
对于M_ID = 135709, Y_ID = 2, T_ID = 7 and E_ID = 1
;
第 2 场活动在(2017 年 3 月 31 日)第 1 场活动结束后立即开始(2017 年 4 月 1 日)。
因此,在这种情况下,输出应该是第一个事件的开始日期(2017 年 1 月 1 日)和第二个事件的结束日期(2017 年 6 月 30 日)。
同样,对于M_ID = 135709, Y_ID = 2, T_ID = 7 and E_ID = 3
;
第 2 场比赛于 2017 年 2 月 1 日开始,紧接着第 1 场比赛于 2017 年 1 月 31 日结束。
第 3 场赛事在(2017 年 4 月 30 日)第二场赛事结束后立即开始(2017 年 4 月 1 日)。
因此,在这种情况下,输出应该是第一个事件的开始日期(2017 年 1 月 1 日)和第三个事件的结束日期(2017 年 6 月 30 日)。
并且由于在第 4 个事件 StartDate 和第 3 个事件 EndDate 之间存在 GAP(即第 4 个事件不会在第 3 个事件之后开始),因此日期应该保持不变。
有人可以帮我吗。?
这有点令人费解,但我认为这会得到你想要的结果:
输出:
该代码使用
LAG()
聚合来检查下一个逻辑行,以查看开始日期是否早于当前行中的结束日期或与结束日期相邻一天。然后它使用两个ROW_NUMBER()
聚合来获取每个组的第一行和最后一行。如果您使用的是 SQL 2012 或更高版本,则可以使用
LEAD
函数调用(即LEAD([BeginDate],1) OVER (PARTITION BY [M_ID],[Y_ID],[T_ID],[E_ID]) ORDER BY [BeginDate])
. 这样,您可以将当前行EndDate
与下一行进行比较BeginDate
。