@@ -2105,47 +2105,10 @@ Answer to Puzzle #47
21052105Work Schedule
21062106*/ -- --------------------------------------------------
21072107
2108- DROP TABLE IF EXISTS #CalendarTable;
21092108DROP TABLE IF EXISTS #Schedule;
21102109DROP TABLE IF EXISTS #Activity;
2111- DROP TABLE IF EXISTS #ActivityDetail;
2112- DROP TABLE IF EXISTS #ActivityGroupings1;
2113- DROP TABLE IF EXISTS #ActivityGroupings2
2114- DROP TABLE IF EXISTS #ActivityGroupings3;
2115- DROP TABLE IF EXISTS #ActivityGroupings4;
2116- GO
2117-
2118- CREATE TABLE #CalendarTable
2119- (
2120- MyDateTime DATETIME PRIMARY KEY
2121- );
2122- GO
2123-
2124- INSERT INTO #CalendarTable
2125- VALUES
2126- (CAST (' 10/01/2021 09:45 AM' AS DATETIME )),
2127- (CAST (' 10/01/2021 10:00 AM' AS DATETIME )),
2128- (CAST (' 10/01/2021 10:15 AM' AS DATETIME )),
2129- (CAST (' 10/01/2021 10:30 AM' AS DATETIME )),
2130- (CAST (' 10/01/2021 10:45 AM' AS DATETIME )),
2131- (CAST (' 10/01/2021 11:00 AM' AS DATETIME )),
2132- (CAST (' 10/01/2021 11:15 AM' AS DATETIME )),
2133- (CAST (' 10/01/2021 11:30 AM' AS DATETIME )),
2134- (CAST (' 10/01/2021 11:45 AM' AS DATETIME )),
2135- (CAST (' 10/01/2021 12:00 PM' AS DATETIME )),
2136- (CAST (' 10/01/2021 12:15 PM' AS DATETIME )),
2137- (CAST (' 10/01/2021 12:30 PM' AS DATETIME )),
2138- (CAST (' 10/01/2021 12:45 PM' AS DATETIME )),
2139- (CAST (' 10/01/2021 1:00 PM' AS DATETIME )),
2140- (CAST (' 10/01/2021 1:15 PM' AS DATETIME )),
2141- (CAST (' 10/01/2021 1:30 PM' AS DATETIME )),
2142- (CAST (' 10/01/2021 1:45 PM' AS DATETIME )),
2143- (CAST (' 10/01/2021 2:00 PM' AS DATETIME )),
2144- (CAST (' 10/01/2021 2:15 PM' AS DATETIME )),
2145- (CAST (' 10/01/2021 2:30 PM' AS DATETIME )),
2146- (CAST (' 10/01/2021 2:45 PM' AS DATETIME )),
2147- (CAST (' 10/01/2021 3:00 PM' AS DATETIME )),
2148- (CAST (' 10/01/2021 3:15 PM' AS DATETIME ));
2110+ DROP TABLE IF EXISTS #ScheduleTimes;
2111+ DROP TABLE IF EXISTS #ActivityCoalesce
21492112GO
21502113
21512114CREATE TABLE #Schedule
@@ -2180,91 +2143,39 @@ VALUES
21802143(' B' ,' Break' ,CAST (' 2021-10-01 11:00:00'AS DATETIME ),CAST (' 2021-10-01 11:15:00' AS DATETIME ));
21812144GO
21822145
2183- -- Step 1
2184- WITH cte_Work AS
2185- (
2186- SELECT ScheduleID
2187- ,' Work' AS ActivityName
2188- ,MyDateTime
2189- FROM #Schedule s INNER JOIN
2190- #CalendarTable c ON c .MyDateTime >= s .StartTime AND c .MyDateTime <= s .EndTime
2191- )
2192- ,cte_Activity AS
2193- (
2194- SELECT c .ScheduleID
2195- ,COALESCE (s .ActivityName , c .ActivityName ) AS ActivityName
2196- ,c .MyDateTime
2197- FROM cte_Work c LEFT OUTER JOIN
2198- #Activity s ON c .MyDateTime >= s .StartTime AND c .MyDateTime <= s .EndTime
2199- AND s .ScheduleID = c .ScheduleID
2200- )
2201- SELECT ROW_NUMBER () OVER (PARTITION BY ScheduleID ORDER BY ScheduleID, MyDateTime ASC ) AS StepNumber
2202- ,*
2203- INTO #ActivityDetail
2204- FROM cte_Activity;
2205- GO
2206-
2207- -- Step 2
2208- SELECT ScheduleID
2209- ,ActivityName
2210- ,StepNumber
2211- ,ROW_NUMBER () OVER (PARTITION BY ScheduleID, ActivityName ORDER BY StepNumber) AS RowNumber
2212- ,StepNumber - ROW_NUMBER () OVER (PARTITION BY ScheduleId, ActivityName ORDER BY StepNumber) AS Rnk
2213- INTO #ActivityGroupings1
2214- FROM #ActivityDetail
2215- ORDER BY StepNumber;
2216- GO
2217-
2218- -- Step 3
2219- SELECT ROW_NUMBER () OVER (ORDER BY ScheduleId, Rnk) AS StepOrder
2220- ,ScheduleID
2221- ,ActivityName
2222- ,MAX (StepNumber) - MIN (StepNumber) + 1 AS ConsecutiveCount
2223- ,MIN (StepNumber) AS MinStepNumber
2224- ,MAX (StepNumber) AS MaxStepNumber
2225- INTO #ActivityGroupings2
2226- FROM #ActivityGroupings1
2227- GROUP BY
2228- Rnk,
2229- ScheduleID,
2230- ActivityName;
2231- GO
22322146
2233- -- Step 4
2234- SELECT a.* ,
2235- b .StepOrder AS DistinctGroupingSet
2236- INTO #ActivityGroupings3
2237- FROM #ActivityDetail a INNER JOIN
2238- #ActivityGroupings2 b ON a .StepNumber BETWEEN b .MinStepNumber AND b .MaxStepNumber
2239- AND A .ScheduleID = b .ScheduleID
2240- ORDER BY 1 ;
2147+ SELECT ScheduleID, StartTime AS ScheduleTime INTO #ScheduleTimes FROM #Schedule
2148+ UNION
2149+ SELECT ScheduleID, EndTime FROM #Schedule
2150+ UNION
2151+ SELECT ScheduleID, StartTime FROM #Activity
2152+ UNION
2153+ SELECT ScheduleID, EndTime FROM #Activity;
22412154GO
22422155
2243- -- Step 5
2244- SELECT MIN (StepNumber) AS MinStepNumber
2245- ,MAX (StepNumber) AS MaxStepNumber
2246- ,ScheduleID
2247- ,ActivityName
2248- ,DistinctGroupingSet
2249- ,MIN (MyDateTime) AS StartTime
2250- ,MAX (MyDateTime) AS EndTime
2251- INTO #ActivityGroupings4
2252- FROM #ActivityGroupings3
2253- GROUP BY ScheduleId
2254- ,ActivityName
2255- ,DistinctGroupingSet
2256- ORDER BY 1 ;
2156+ SELECT a .ScheduleID
2157+ ,a .ScheduleTime
2158+ ,COALESCE (b .ActivityName , c .ActivityName , ' Work' ) AS ActivityName
2159+ INTO #ActivityCoalesce
2160+ FROM #ScheduleTimes a LEFT OUTER JOIN
2161+ #Activity b ON a .ScheduleTime = b .StartTime and a .ScheduleId = b .ScheduleID LEFT OUTER JOIN
2162+ #Activity c ON a .ScheduleTime = c .EndTime and a .ScheduleId = b .ScheduleID LEFT OUTER JOIN
2163+ #Schedule d ON a .ScheduleTime = d .StartTime and a .ScheduleId = b .ScheduleID LEFT OUTER JOIN
2164+ #Schedule e ON a .ScheduleTime = e .EndTime and a .ScheduleId = b .ScheduleID
2165+ ORDER BY a .ScheduleID , a .ScheduleTime ;
22572166GO
22582167
2259- -- Results
2260- SELECT ScheduleID
2261- ,ActivityName
2262- ,(CASE WHEN ActivityName = ' Work'
2263- THEN LAG(EndTime,1 ,StartTime) OVER (PARTITION BY ScheduleID ORDER BY MinStepNumber) ELSE StartTime END ) StartTime2
2264- ,(CASE WHEN ActivityName = ' Work'
2265- THEN LEAD(StartTime,1 ,EndTime) OVER (PARTITION BY ScheduleID ORDER BY MinStepNumber) ELSE EndTime END ) EndTime2
2266- FROM #ActivityGroupings4
2267- ORDER BY ScheduleID, MinStepNumber;
2168+ WITH cte_Lead AS
2169+ (
2170+ SELECT ScheduleID,
2171+ ActivityName,
2172+ ScheduleTime as StartTime,
2173+ LEAD(ScheduleTime) OVER (PARTITION BY ScheduleID ORDER BY ScheduleTime) AS EndTime
2174+ FROM #ActivityCoalesce
2175+ )
2176+ SELECT *
2177+ FROM cte_Lead
2178+ WHERE EndTime IS NOT NULL ;
22682179
22692180/* ----------------------------------------------------
22702181Answer to Puzzle #48
0 commit comments