【发布时间】:2014-05-05 22:55:21
【问题描述】:
我有一个我无法弄清楚的问题。我创建了一个视图,当它运行时,它会为我提供旅行工人的安置数据。重要的部分是PlacementID、StartDate 和EndDate:
TravelerID FirstName LastName PlacementID StartDate EndDate
--------------------------------------------------------------------
65648 Lori Williams 106593 09/22/01 02/08/03
65648 Lori Williams 392605 02/24/03 05/24/03
65648 Lori Williams 477950 05/26/03 11/22/03
65648 Lori Williams 600089 12/01/03 05/29/04
65648 Lori Williams 717424 05/30/04 12/04/04
65648 Lori Williams 832842 12/05/04 02/04/05
65648 Lori Williams 867492 02/06/05 07/30/05
65648 Lori Williams 979375 08/15/05 11/12/05
65648 Lori Williams 1030555 11/14/05 05/13/06
65648 Lori Williams 1155937 05/15/06 01/06/07
65648 Lori Williams 1341007 01/07/07 01/05/08
65648 Lori Williams 1709959 01/06/08 05/31/08
65648 Lori Williams 1878735 06/01/08 07/19/08
65648 Lori Williams 1937168 07/20/08 01/31/09
他们希望将连续的展示位置计为一个,并使用第一个展示位置的PlacementID。例如,请注意PlacementIDs 600089,717424 和 832842。请注意,下一个的开始日期是前一个结束日期的一天后。在列表的下方还有其他连续的展示位置。所以期望的输出是:
TravelerID FirstName LastName PlacementID StartDate EndDate
--------------------------------------------------------------------
65648 Lori Williams 106593 09/22/01 02/08/03
65648 Lori Williams 392605 02/24/03 05/24/03
65648 Lori Williams 477950 05/26/03 11/22/03
65648 Lori Williams 600089 12/01/03 02/04/05
65648 Lori Williams 867492 02/06/05 07/30/05
65648 Lori Williams 979375 08/15/05 11/12/05
65648 Lori Williams 1030555 11/14/05 05/13/06
65648 Lori Williams 1155937 05/15/06 01/31/09
下面是一些生成示例数据的代码:
CREATE TABLE [dbo].vw_PlacementData(
TravelerID int
,FirstName varchar(255)
,LastName varchar(255)
,PlacementID int
,StartDate datetime
,EndDate datetime
) ON [PRIMARY]
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',106593,'9/22/01','2/8/03')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',392605,'2/24/03','5/24/03')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',477950,'5/26/03','11/22/03')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',600089,'12/1/03','5/29/04')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',717424,'5/30/04','12/4/04')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',832842,'12/5/04','2/4/05')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',867492,'2/6/05','7/30/05')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',979375,'8/15/05','11/12/05')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',1030555,'11/14/05','5/13/06')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',1155937,'5/15/06','1/6/07')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',1341007,'1/7/07','1/5/08')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',1709959,'1/6/08','5/31/08')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',1878735,'6/1/08','7/19/08')
INSERT INTO vw_PlacementData VALUES (65648,'Lori','Williams',1937168,'7/20/08','1/31/09')
` 我试图将表格加入到自身中,但它并没有考虑超过一个连续的位置。从示例中可以看出,可能需要计算 2 或 20 个连续的展示位置。
非常感谢任何帮助!!!
【问题讨论】:
-
这似乎是overlapping date range 问题的变体(因为它是第二天而不是实际重叠)。这些解决方案中的任何一个对您有用吗,或者在类似的问题上有用吗?如果他们不这样做,您尝试过什么不起作用?
-
谢谢!我现在正在查看链接,看看该解决方案是否适合我。
-
此外,为此返回原始数据而不是视图可能会很方便。特别是因为该 CTE 的使用似乎正在超时......
标签: sql sql-server sql-server-2005 grouping sequential