set based order of dates

by nate_c on January 10th, 2011

This was tested in Postgresql but should work fine in sql server as it has row_number function also.

Syntax: SQL
Show lines - Hide lines - Show in textbox - Download
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
    ;
 

Leave a Reply

Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS