MS SQL将日期行组合为开始结束日期

时间:2016-03-09 19:23:18

标签: sql sql-server tsql

我正在寻找一个select语句或者可以组合多行的东西,当同一个房间的两个日期之间只有一天进入一个行时,每个房间都有这样一段时间的开始和结束日期。 / p>

如果只有一天在上一行之间,则应将所有行与相同的RoomID合并,而是计算Start DateEnd Date

我尝试过group by,但是无法在输出附近创建任何东西。

它自己包含的表超过百万条记录,代码需要在两个日期之间组合所有行,在这种情况下,它是从2016-08-01到2016-09-03

我希望有人能够帮助我解决这个问题,谢谢。

我的数据如下所示,始终按RoomID排序Date

ID          RoomID      Date
60307       1164        01-08-2016 00:00
60308       1164        02-08-2016 00:00
60309       1164        03-08-2016 00:00
60310       1164        04-08-2016 00:00
60312       1164        06-08-2016 00:00
60313       1164        07-08-2016 00:00
60314       1165        01-08-2016 00:00
60315       1165        02-08-2016 00:00
60316       1165        03-08-2016 00:00
60317       1165        04-08-2016 00:00
60318       1165        05-08-2016 00:00
60319       1165        06-08-2016 00:00
60320       1165        07-08-2016 00:00
60383       1164        10-08-2016 00:00
60384       1164        11-08-2016 00:00
60385       1164        12-08-2016 00:00
60386       1165        10-08-2016 00:00
60387       1165        11-08-2016 00:00
60388       1165        12-08-2016 00:00
60395       1164        01-09-2016 00:00
60396       1164        02-09-2016 00:00
60397       1164        03-09-2016 00:00
60398       1164        04-09-2016 00:00
60399       1164        05-09-2016 00:00
60400       1165        01-09-2016 00:00
60401       1165        02-09-2016 00:00
60402       1165        03-09-2016 00:00

组合应该是这样的:

RoomID      Startdate       EndDate
1164        01-08-2016 00:00        04-08-2016 00:00
1164        06-08-2016 00:00        07-08-2016 00:00
1165        01-08-2016 00:00        07-08-2016 00:00
1164        10-08-2016 00:00        12-08-2016 00:00
1165        10-08-2016 00:00        12-08-2016 00:00
1164        01-09-2016 00:00        05-09-2016 00:00
1165        01-09-2016 00:00        03-09-2016 00:00

1 个答案:

答案 0 :(得分:3)

您可以尝试以下内容:

select 
  RoomID,
  MIN([Date]) as StartDate, 
  MAX([Date]) as EndDate 
from 
 (
  Select 
   *, 
   ROW_NUMBER() OVER(PARTITION BY RoomID ORDER BY [Date] asc) as ranking 
   from tbl
 ) t  
 group by 
   RoomID, (CAST([Date] AS INT)-Ranking)
order by 
   RoomID, (CAST([Date] AS INT)-Ranking)