CREATE TABLE TestData
(
Value INT NOT NULL
,UpdatedOn DATETIME NOT NULL
);
INSERT TestData
SELECT 1326, '2011-10-18 00:06:00.000'
UNION ALL
SELECT 1327, '2011-10-18 00:05:00.000'
UNION ALL
SELECT 1330, '2011-10-18 00:03:00.000'
UNION ALL
SELECT 1331, '2011-10-18 00:02:00.000'
UNION ALL
SELECT 1334, '2011-10-18 00:01:00.000'
UNION ALL
SELECT 1333, '2011-10-18 00:00:00.000';
SELECT 'Solution 1';
WITH CteRowNumber
AS
(
SELECT a.Value
,a.UpdatedOn
,ROW_NUMBER() OVER(ORDER BY UpdatedOn DESC) RowNumber
FROM TestData a
)
SELECT crt.Value AS Changed
,prev.Value
,prev.UpdatedOn
FROM CteRowNumber prev
LEFT JOIN CteRowNumber crt ON prev.RowNumber + 1 = crt.RowNumber
SELECT 'Solution 2';
DECLARE @Results TABLE
(
Value INT NOT NULL
,UpdatedOn DATETIME NOT NULL
,RowNumber INT PRIMARY KEY CLUSTERED
);
INSERT @Results (Value, UpdatedOn, RowNumber)
SELECT a.Value
,a.UpdatedOn
,ROW_NUMBER() OVER(ORDER BY UpdatedOn DESC) RowNumber
FROM TestData a;
SELECT crt.Value AS Changed
,prev.Value
,prev.UpdatedOn
FROM @Results prev
LEFT JOIN @Results crt ON prev.RowNumber + 1 = crt.RowNumber
DROP TABLE TestData;