-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathGrouping Keys.sql
66 lines (62 loc) · 1.57 KB
/
Grouping Keys.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
DROP TABLE IF EXISTS #Groupings;
GO
CREATE TABLE #Groupings
(
StepNumber INTEGER PRIMARY KEY,
TestCase VARCHAR(100) NOT NULL,
[Status] VARCHAR(100) NOT NULL
);
GO
INSERT INTO #Groupings (StepNumber, TestCase, [Status]) VALUES
(1,'Test Case 1','Passed'),
(2,'Test Case 2','Passed'),
(3,'Test Case 3','Passed'),
(4,'Test Case 4','Passed'),
(5,'Test Case 5','Failed'),
(6,'Test Case 6','Failed'),
(7,'Test Case 7','Failed'),
(8,'Test Case 8','Failed'),
(9,'Test Case 9','Failed'),
(10,'Test Case 10','Passed'),
(11,'Test Case 11','Passed'),
(12,'Test Case 12','Passed');
GO
--Solution 1
WITH cte_Groupings AS
(
SELECT StepNumber,
[Status],
StepNumber - ROW_NUMBER() OVER (PARTITION BY [Status] ORDER BY StepNumber) AS Rnk
FROM #Groupings
)
SELECT MIN(StepNumber) AS MinStepNumber,
MAX(StepNumber) AS MaxStepNumber,
[Status],
COUNT(*) AS ConsecutiveCount,
MAX(StepNumber) - MIN(StepNumber) + 1 AS ConsecutiveCount_MinMax
FROM cte_Groupings
GROUP BY Rnk,
[Status]
ORDER BY 1, 2;
GO
--Solution 2
WITH cte_Lag AS
(
SELECT *,
LAG([Status]) OVER(ORDER BY StepNumber) AS PreviousStatus
FROM #Groupings
),
cte_Groupings AS
(
SELECT *,
SUM(CASE WHEN PreviousStatus <> [Status] THEN 1 ELSE 0 END) OVER (ORDER BY StepNumber) AS GroupNumber
FROM cte_Lag
)
SELECT MIN(StepNumber) AS MinStepNumber,
MAX(StepNumber) AS MaxStepNumber,
[Status],
COUNT(*) AS ConsecutiveCount,
MAX(StepNumber) - MIN(StepNumber) + 1 AS ConsecutiveCount_MinMax
FROM cte_Groupings
GROUP BY [Status], GroupNumber
GO