set based order of dates
This was tested in Postgresql but should work fine in sql server as it has row_number function also.
Syntax:
SQL
SELECT state, min(start_timestamp), max(end_timestamp) FROM ( SELECT first.state, first.timestamp_ AS start_timestamp, second.timestamp_ AS end_timestamp FROM ( SELECT *, row_number() over (ORDER BY timestamp_) AS id FROM test ) AS first LEFT OUTER JOIN ( SELECT *, row_number() over (ORDER BY timestamp_) AS id FROM test ) AS second ON first.id = second.id - 1 AND first.state != second.state ) AS agg GROUP BY state, start_timestamp HAVING max(end_timestamp) IS NOT NULL OR start_timestamp = (SELECT max(timestamp_) FROM test) ORDER BY start_timestamp ;