create table #Numbers(DateEntered datetime, Number int) go
insert #Numbers values('07/01/00 12:00:00 PM', 1) insert #Numbers values('07/01/00 12:01:00 PM', 2) insert #Numbers values('07/01/00 12:02:00 PM', 3) insert #Numbers values('07/02/00 12:00:00 PM', 998) insert #Numbers values('07/02/00 12:01:00 PM', 999) insert #Numbers values('07/02/00 12:02:00 PM', 1) insert #Numbers values('07/03/00 12:00:00 PM', 998) insert #Numbers values('07/03/00 12:01:00 PM', 1) insert #Numbers values('07/03/00 12:02:00 PM', 999) insert #Numbers values('07/03/00 12:03:00 PM', 2) insert #Numbers values('07/03/00 12:04:00 PM', 3) go
SELECT nn.DateEntered , nn.Number FROM ( SELECT n.DateEntered , n.Number , CASE WHEN ( n.SameDay = 1 ) And ( ( n.Number < 999 And n.DateEntered < n.OneDateEntered ) Or ( n.Number = 999 ) ) THEN n.OneDateEntered END AS NewDateEntered , CASE WHEN SameDay = 1 And n.Number = 1 THEN 1000 END AS NewNumber FROM ( SELECT n1.DateEntered , n1.Number , ( CASE WHEN ( SELECT COUNT( * ) FROM #Numbers n2 WHERE n2.Number in ( 999 , 1 ) And CONVERT( varchar , n1.DateEntered , 101 ) = CONVERT( varchar , n2.DateEntered , 101 ) ) = 2 THEN 1 END ) AS SameDay , ( SELECT n4.DateEntered FROM #Numbers n4 WHERE CONVERT( varchar , n1.DateEntered , 101 ) = CONVERT( varchar , n4.DateEntered , 101 ) And n4.Number = 1 ) AS OneDateEntered FROM #Numbers as n1 ) AS n ) AS nn
ORDER BY COALESCE( nn.NewDateEntered , nn.DateEntered ) , COALESCE( nn.NewNumber , nn.Number )
SELECT DateEntered, Number FROM (SELECT n1.*, minNumber, maxNumber FROM #Numbers as n1 JOIN (SELECT DateEntered = convert(char(10), DateEntered, 102), minNumber = MIN( Number ), maxNumber = MAX( Number ) FROM #Numbers GROUP BY convert(char(10), DateEntered, 102) ) AS n2 ON convert(char(10), n1.DateEntered, 102) = convert(char(10), n2.DateEntered, 102) ) AS n3 ORDER BY convert(char(10), DateEntered, 102), CASE WHEN maxNumber <= minNumber + 500 THEN Number ELSE NULL END , CASE WHEN maxNumber > minNumber + 500 THEN ( CASE WHEN Number >= maxNumber - 500 THEN Number ELSE Number + 1000 END ) ELSE NULL END |