How to group list of start times by a category?
Using the newly added LAG() and LEAD() functions makes it look easy:

WITH a AS
    ( SELECT PersonID, FloorNum, EnterTime,
             PrevFloorNum = LAG(FloorNum) OVER
                                (PARTITION BY PersonID ORDER BY EnterTime)
      FROM RoomAssignments
    ) 
SELECT PersonID, FloorNum,
       FromTime = EnterTime,
       ToTime = LEAD(EnterTime) OVER 
                    (PARTITION BY PersonID ORDER BY EnterTime)
FROM a
WHERE PrevFloorNum &lt;&gt; FloorNum OR PrevFloorNum IS NULL 
ORDER BY PersonID, FromTime ;


Test in SQLfiddle