TSQL Challenge 23 - Solution By Mueller Lutz



--Mueller_Lutz_tsqlchallenge_23.sql
-- submitted by Lutz Mueller on 02/14/2010
-- version 1

;WITH AuditTimeNumbered AS
(
	SELECT  ROW_NUMBER() OVER(ORDER BY AuditTime) AS ROW, AuditTime, IsOnline
	FROM    TC23
)
,
AuditTimeRelevant AS
(
	SELECT  
		ATNmb1.IsOnline,  
		ROW_NUMBER() OVER(ORDER BY ISNULL(ATNmb1.AuditTime, ATNmb2.AuditTime)) rown,
		CASE 
			WHEN ATNmb2.AuditTime IS NULL THEN DATEADD(hh,DATEDIFF(hh,0,DATEADD(ms,-10,ATNmb1.AuditTime)),0) 
			WHEN ATNmb1.AuditTime IS NULL THEN DATEADD(hh,DATEDIFF(hh,0,DATEADD(ms,10,ATNmb2.AuditTime))+1,0)
			ELSE DATEADD(ss,DATEDIFF(ss,ATNmb2.AuditTime,ATNmb1.AuditTime)/2,ISNULL(ATNmb2.AuditTime,ATNmb1.AuditTime)) 
			END AS t
	FROM AuditTimeNumbered ATNmb1
	FULL OUTER JOIN AuditTimeNumbered ATNmb2
		ON ATNmb1.row = ATNmb2.row + 1
	WHERE ISNULL(ATNmb1.IsOnline ^ ATNmb2.IsOnline,1)= 1
)
SELECT 
	ATR1.t AS TimeFrom,
	ATR2.t AS TimeTo,
	CASE WHEN ATR1.IsOnline = 1 THEN 'Yes' 
		ELSE 'No' END IsOnline
FROM    AuditTimeRelevant ATR1
	INNER JOIN AuditTimeRelevant ATR2
	ON ATR1.rown = ATR2.rown - 1
ORDER BY TimeFrom

Did you find something incorrect/wrong with this solution? Take a few seconds to Report It.

Did you understand how this solution work? If you find it difficult to understand, you can Request an Explanation or you can Write an explanation to help others better understand this solution.