Skip to content

Commit 893d158

Browse files
Update Advanced SQL Puzzles Solutions.sql
1 parent c232aef commit 893d158

File tree

1 file changed

+30
-119
lines changed

1 file changed

+30
-119
lines changed

Advanced SQL Puzzles/Advanced SQL Puzzles Solutions.sql

Lines changed: 30 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -2105,47 +2105,10 @@ Answer to Puzzle #47
21052105
Work Schedule
21062106
*/----------------------------------------------------
21072107

2108-
DROP TABLE IF EXISTS #CalendarTable;
21092108
DROP TABLE IF EXISTS #Schedule;
21102109
DROP 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
21492112
GO
21502113

21512114
CREATE 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));
21812144
GO
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;
22412154
GO
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;
22572166
GO
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
/*----------------------------------------------------
22702181
Answer to Puzzle #48

0 commit comments

Comments
 (0)