Recursion will work with SQL2005/8:-- *** Test Data ***DECLARE @t TABLE( ToolId int NOT NULl ,time_occurred datetime NOT NULL ,alarmtext varchar(50) NOT NULL)INSERT INTO @tSELECT 1, '20090514 12:20', 'DOOR OPEN' UNION ALLSELECT 1, '20090514 12:22', 'DOOR OPEN' UNION ALLSELECT 1, '20090514 12:30', 'DOOR OPEN' UNION ALLSELECT 2, '20090514 12:20', 'DOOR OPEN' UNION ALLSELECT 2, '20090514 12:24', 'DOOR OPEN'-- *** Test Data ***;WITH cte (ToolId, time_occurred, alarmtext)AS( SELECT ToolId, time_occurred, alarmtext FROM ( SELECT ToolId, time_occurred, alarmtext ,ROW_NUMBER() OVER (PARTITION BY ToolId, alarmtext ORDER BY time_occurred) AS RowNum FROM @t ) D1 WHERE RowNum = 1 UNION ALL SELECT ToolId, time_occurred, alarmtext FROM ( SELECT T.ToolId, T.time_occurred, T.alarmtext ,ROW_NUMBER() OVER (PARTITION BY T.ToolId, T.alarmtext ORDER BY T.time_occurred) AS RowNum FROM @t T JOIN cte C ON T.ToolId = C.ToolId AND T.alarmtext = C.alarmtext AND T.time_occurred >= DATEADD(minute, 5, C.time_occurred) ) D2 WHERE RowNum = 1)SELECT *FROM cteORDER BY ToolId, time_occurred, alarmtext