--Drop the Temp table if it exists
IF OBJECT_ID('tempdb.dbo.#t') IS NOT NULL BEGIN DROP TABLE #t END;
--create test table
CREATE TABLE #t ([ID] [int] ,[Date] [date])
--Fill the test table with values
INSERT INTO #t
SELECT 1,'1/1/2011'
UNION SELECT 1,'2/1/2011'
UNION SELECT 1,'3/1/2011'
UNION SELECT 1,'1/15/2011'
UNION SELECT 2,'1/1/2011'
UNION SELECT 2,'4/1/2011'
UNION SELECT 2,'5/5/2011'
UNION SELECT 2,'8/2/2011'
UNION SELECT 3,'1/10/2011'
UNION SELECT 3,'6/1/2011'
UNION SELECT 3,'7/12/2011'
UNION SELECT 3,'3/14/2011'
UNION SELECT 3,'10/1/2011'
UNION SELECT 4,'1/1/2011'
UNION SELECT 4,'3/1/2011'
UNION SELECT 4,'4/15/2011'
UNION SELECT 4,'11/20/2011'
UNION SELECT 4,'1/15/2011'
UNION SELECT 4,'4/1/2011'
UNION SELECT 5,'8/1/2011'
UNION SELECT 5,'10/1/2011'
UNION SELECT 5,'2/3/2011'
UNION SELECT 5,'5/13/2011'
UNION SELECT 5,'8/19/2011'
--view the "max" records
SELECT [ID] ,MAX([DATE]) AS MaxDate
FROM #t
GROUP BY [ID]
--View the "non-max" records
SELECT t.[ID] ,t.[DATE]
FROM #t t
LEFT JOIN (
SELECT [ID] ,MAX([DATE]) AS MaxDate
FROM #t
GROUP BY [ID]
) x
ON t.ID = x.ID
AND t.Date = x.MaxDate
WHERE x.ID IS NULL
--Delete the "non-max" records
DELETE #t
FROM #t t
LEFT JOIN (
SELECT [ID] ,MAX([DATE]) AS MaxDate
FROM #t
GROUP BY [ID]
) x
ON t.ID = x.ID
AND t.Date = x.MaxDate
WHERE x.ID IS NULL
--19 records
--Remaining records
SELECT * FROM #t
--ID Date
--1 2011-03-01
--2 2011-08-02
--3 2011-10-01
--4 2011-11-20
--5 2011-10-01