TSQL Challenge 23 - Solution By Dalibor Margotic



--Dalibor_Margotic_tsqlchallenge_23.sql
;WITH CTEResult AS (
SELECT ROW_NUMBER() OVER(ORDER BY AuditTime) AS RBR, * 
FROM TC23
)
, CTEResult2 AS 
(
	SELECT 
		ROW_NUMBER() OVER(ORDER BY COALESCE(CTE1.RBR, CTE2.rbr)) AS RBR
	,
		CASE WHEN CTE2.RBR IS NULL THEN 
			DATEADD(HOUR,DATEPART(HOUR,DATEADD(SECOND,-1,CTE1.AuditTime)),DATEADD(DAY,DATEDIFF(DAY,0,DATEADD(SECOND,-1,CTE1.AuditTime)),0))
		WHEN CTE1.RBR IS NULL THEN 
			DATEADD(MINUTE,DATEPART(MINUTE,60-DATEADD(SECOND,1,CTE2.AuditTime)),DATEADD(SECOND, DATEPART(SECOND,60-DATEADD(SECOND,1,CTE2.AuditTime)), DATEADD(SECOND,1,CTE2.AuditTime)))
		ELSE 
			DATEADD(SECOND,(DATEDIFF(SECOND,CTE1.AuditTime, CTE2.AuditTime)-1) / 2,CTE1.AuditTime)
		END 
		AS Time
	,	CTE1.IsOnline
	FROM CTEResult AS CTE1
	FULL MERGE JOIN CTEResult AS CTE2 ON
		CTE1.RBR = CTE2.RBR + 1
	WHERE NOT CTE1.IsOnline = CTE2.IsOnline OR CTE2.IsOnline IS NULL OR CTE1.rbr = 1 OR CTE1.IsOnline is null
) 
SELECT 
	CASE WHEN CTE2.Time IS NOT NULL
	THEN CTE2.Time
	ELSE
		DATEADD(HOUR,DATEPART(HOUR,DATEADD(millisecond,-3,CTE1.Time)),DATEADD(DAY,DATEDIFF(DAY,0,DATEADD(millisecond,-3,CTE1.Time)),0))
	END
	AS TimeFrom
,	CTE1.Time AS TimeTo 
,	CASE CTE2.IsOnline WHEN 1 THEN 'Yes' ELSE 'No' END AS IsOnline
FROM CTEResult2 AS CTE1
INNER MERGE JOIN CTEResult2 AS CTE2 ON
	CTE1.RBR = CTE2.RBR + 1

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.