我正在寻找一个select语句或者可以组合多行的东西,当同一个房间的两个日期之间只有一天进入一个行时,每个房间都有这样一段时间的开始和结束日期。 / p>
如果只有一天在上一行之间,则应将所有行与相同的RoomID
合并,而是计算Start Date
和End 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
答案 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)