What about something like this?
DECLARE @TMP TABLE ( ID INT, ADMIT DATE )
INSERT INTO @TMP ( ID, ADMIT )
VALUES ( 123, '2015-09-01' )
,( 123, NULL )
,( 123, NULL )
,( 123, NULL )
,( 123, '2015-09-05' )
SELECT TMP.ID
,CASE
WHEN TMP.ADMIT IS NULL
THEN DATEADD(D,(ROW_NUMBER() OVER (PARTITION BY TMP.ID, TMP.ADMIT ORDER BY TMP.ID ASC)),B.MIN_ADMIT)
ELSE TMP.ADMIT
END AS NEW_DATE
FROM @TMP AS TMP
INNER JOIN ( SELECT ID, MIN(ADMIT) AS MIN_ADMIT
FROM @TMP
GROUP BY ID
) B ON B.ID = TMP.ID
ORDER BY TMP.ID, NEW_DATE ASC
Basically, this just creates a temp table with your dummy data so we can test with some values. Then performs the query that uses a row ranking for each row number and add's that value to the minimum date found in the original list...
We need the INNER JOIN
because we need to do a GROUP BY
clause to get the MIN
date from your original table. We can't do a GROUP BY
in our original SELECT
because that will begin excluding some rows as we only have ID
and ADMIT
to group off of; therefore the 3 records will NULL
would be truncated to 1 record.