You can do this using Gaps and Islands logic:
SELECT VehicleID, Connected, MIN(Date) AS Date
FROM ( SELECT *,
DENSE_RANK() OVER(PARTITION BY VehicleID ORDER BY Date) -
DENSE_RANK() OVER(PARTITION BY VehicleID, Connected ORDER BY Date) AS GroupingSet,
MIN(CASE WHEN Connected THEN Date END) OVER(PARTITION BY VehicleID) AS FirstConnected
FROM status
WHERE VehicleID = 'redcar'
AND date >= '2014-02-28 00:00:00'
AND date < '2014-03-01 00:00:00'
) s
WHERE Date > FirstConnected
GROUP BY VehicleID, Connected, GroupingSet
Example on SQL Fiddle
If you also need to retrieve the StatusID
you will need to add a further ranking function and only select only the first row:
SELECT StatusID,
VehicleID,
Connected,
Date
FROM ( SELECT StatusID,
VehicleID,
Connected,
Date,
ROW_NUMBER() OVER(PARTITION BY VehicleID, Connected, GroupingSet ORDER BY Date) AS RowNumber
FROM ( SELECT *,
DENSE_RANK() OVER(PARTITION BY VehicleID ORDER BY Date) -
DENSE_RANK() OVER(PARTITION BY VehicleID, Connected ORDER BY Date) AS GroupingSet,
MIN(CASE WHEN Connected THEN Date END) OVER(PARTITION BY VehicleID) AS FirstConnected
FROM status
WHERE VehicleID = 'redcar'
AND date >= '2014-02-28 00:00:00'
AND date < '2014-03-01 00:00:00'
) s
WHERE Date > FirstConnected
) s
WHERE RowNumber = 1;
Example on SQL Fiddle
Or use DISTINCT ON
:
SELECT DISTINCT ON (VehicleID, Connected, GroupingSet)
StatusID,
VehicleID,
Connected,
Date
FROM ( SELECT *,
DENSE_RANK() OVER(PARTITION BY VehicleID ORDER BY Date) -
DENSE_RANK() OVER(PARTITION BY VehicleID, Connected ORDER BY Date) AS GroupingSet,
MIN(CASE WHEN Connected THEN Date END) OVER(PARTITION BY VehicleID) AS FirstConnected
FROM status
WHERE VehicleID = 'redcar'
AND date >= '2014-02-28 00:00:00'
AND date < '2014-03-01 00:00:00'
) s
WHERE Date > FirstConnected
ORDER BY VehicleID, Connected, GroupingSet
Example on SQL Fiddle