【发布时间】:2014-05-06 00:14:18
【问题描述】:
我正在使用 SQL Server 2008 R2 并有下表。
CREATE TABLE room
(id int,
dt date,
course char(1),
constraint pk_roomtime primary key (id, dt)
);
INSERT INTO room (id, dt, course) values
(1, '20140412', 'A'),
(1, '20140414', 'A'),
(1, '20140415', 'A'),
(1, '20140416', 'B'),
(1, '20140417', 'A'),
(1, '20140421', 'A'),
(1, '20140422', 'B'),
(1, '20140423', 'B');
我必须找到房间中每个课程块的第一个和最后一个日期,而不考虑日期之间的间隔。我的房间 1 的结果应该是这样的:
A 20140412 20140415
B 20140416 20140416
A 20140417 20140421
B 20140422 20140423
我尝试使用连接到日历表,但无法正常工作。
【问题讨论】:
-
课程 A 的前三个日期(12 / 14 / 15)不连续。那么课程 A 的两个后续日期(17 / 21)不属于课程 A 的第一个结果集的规则是什么?
-
说实话,在 2008 年它是迄今为止最容易使用光标的。如果您可以升级到 2012,则可以通过改进的窗口功能很好地解决它。
-
@dean - 您将如何获得与窗口函数中提到的结果类似的结果?我看不出前三个数据集与第 5 个和第 6 个数据集之间有什么区别来获得不同的结果 - 除了 B 类中断。这是分隔集合的规则吗?
-
@Nico 在下面查看我的答案以了解 2012 年的解决方案。我无法将其粘贴到 cmets 中。
标签: sql-server-2008 tsql gaps-and-islands