CREATE TABLE Foo ( x INT, ch CHAR(1), dt DATETIME); INSERT INTO Foo VALUES (5, 'a', '20080101'); INSERT INTO Foo VALUES (9, 'a', '20080105'); INSERT INTO Foo VALUES (7, 'a', '20080108'); INSERT INTO Foo VALUES (8, 'b', '20080210'); INSERT INTO Foo VALUES (6, 'b', '20080201'); WITH CTE AS (SELECT x, ROW_NUMBER() OVER( PARTITION BY ch ORDER BY dt) AS x_new FROM Foo) UPDATE CTE SET x = x_new;