Skip to content

Commit b6c6449

Browse files
Add files via upload
1 parent c482077 commit b6c6449

15 files changed

Lines changed: 799 additions & 0 deletions
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*----------------------------------------------------
2+
Scott Peters
3+
https://AdvancedSQLPuzzles.com
4+
5+
Displays all permutations for the numbers 1 through n.
6+
7+
*/----------------------------------------------------
8+
9+
---------------------
10+
---------------------
11+
--Tables used
12+
DROP TABLE IF EXISTS #Numbers;
13+
GO
14+
15+
---------------------
16+
---------------------
17+
--Declare and set variables
18+
DECLARE @vTotalNumbers BIGINT = 3;
19+
20+
---------------------
21+
---------------------
22+
--Create a #Numbers table using recursion
23+
WITH cte_Recursion (Number) AS
24+
(
25+
SELECT 1 AS Number
26+
UNION ALL
27+
SELECT Number + 1
28+
FROM cte_Recursion
29+
WHERE Number < @vTotalNumbers
30+
)
31+
SELECT
32+
Number
33+
INTO #Numbers
34+
FROM cte_Recursion
35+
OPTION (MAXRECURSION 0);
36+
37+
---------------------
38+
---------------------
39+
WITH cte_Numbers AS
40+
(
41+
SELECT CAST(Number AS VARCHAR(MAX)) AS Number
42+
FROM #Numbers
43+
),
44+
cte_Bitmasks AS
45+
(
46+
SELECT
47+
Number,
48+
CAST(POWER(2, ROW_Number() OVER (ORDER BY Number) - 1) AS INT) AS Bitmask
49+
FROM cte_Numbers
50+
),
51+
cte_Recursion AS
52+
(
53+
SELECT Number AS Permutation,
54+
Bitmask
55+
FROM cte_Bitmasks
56+
UNION ALL
57+
SELECT p.Permutation + ',' + b.Number,
58+
p.Bitmask ^ b.Bitmask
59+
FROM cte_Recursion p INNER JOIN
60+
cte_Bitmasks b ON p.Bitmask ^ b.Bitmask > p.Bitmask
61+
)
62+
SELECT ROW_NUMBER() OVER (ORDER BY GETDATE()) AS Id,
63+
Permutation
64+
FROM cte_Recursion
65+
WHERE Bitmask = POWER(2, (SELECT COUNT(*) FROM cte_Numbers)) - 1;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*----------------------------------------------------
2+
Scott Peters
3+
https://AdvancedSQLPuzzles.com
4+
5+
Displays all permutations for the numbers 1 through n.
6+
7+
*/----------------------------------------------------
8+
9+
---------------------
10+
---------------------
11+
DROP TABLE IF EXISTS #Numbers;
12+
GO
13+
14+
---------------------
15+
---------------------
16+
DECLARE @vTotalNumbers INTEGER = 3;
17+
18+
---------------------
19+
---------------------
20+
WITH cte_Numbers (Number)
21+
AS (
22+
SELECT 1 AS Number
23+
UNION ALL
24+
SELECT Number + 1
25+
FROM cte_Numbers
26+
WHERE Number < @vTotalNumbers
27+
)
28+
SELECT
29+
Number
30+
INTO #Numbers
31+
FROM cte_Numbers
32+
OPTION (MAXRECURSION 0);
33+
34+
---------------------
35+
---------------------
36+
WITH cte_Recursion (Permutation, Id, Depth)
37+
AS
38+
(
39+
SELECT CAST(Number AS VARCHAR(MAX)),
40+
CAST(CONCAT(Number,';') AS VARCHAR(MAX)),
41+
1 AS Depth
42+
FROM #Numbers
43+
UNION ALL
44+
SELECT CONCAT(a.Permutation,',',b.Number),
45+
CONCAT(a.Id,b.Number,';'),
46+
a.Depth + 1
47+
FROM cte_Recursion a,
48+
#Numbers b
49+
WHERE a.Depth < @vTotalNumbers AND
50+
a.Id NOT LIKE CONCAT('%',b.Number,';%')
51+
)
52+
SELECT Permutation
53+
FROM cte_Recursion;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*----------------------------------------------------
2+
Scott Peters
3+
https://AdvancedSQLPuzzles.com
4+
5+
Groups hierarchies together.
6+
7+
*/----------------------------------------------------
8+
9+
---------------------
10+
---------------------
11+
DROP TABLE IF EXISTS #Associates;
12+
GO
13+
14+
---------------------
15+
---------------------
16+
CREATE TABLE #Associates
17+
(
18+
Associate1 VARCHAR(100),
19+
Associate2 VARCHAR(100),
20+
PRIMARY KEY (Associate1, Associate2)
21+
);
22+
GO
23+
24+
---------------------
25+
---------------------
26+
INSERT INTO #Associates (Associate1, Associate2) VALUES
27+
('Anne','Betty'),
28+
('Anne','Charles'),
29+
('Betty','Dan'),
30+
('Charles','Emma'),
31+
('Francis','George'),
32+
('George','Harriet');
33+
GO
34+
35+
---------------------
36+
---------------------
37+
WITH cte_Recursion AS
38+
(
39+
SELECT Associate1,
40+
Associate2,
41+
1 AS Depth
42+
FROM #Associates
43+
UNION ALL
44+
SELECT a.Associate1,
45+
b.Associate2,
46+
Depth + 1 AS Depth
47+
FROM #Associates a INNER JOIN
48+
cte_Recursion b ON a.Associate2 = b.Associate1
49+
)
50+
SELECT *
51+
FROM cte_Recursion
52+
UNION ALL
53+
SELECT Associate1,
54+
Associate1,
55+
0 AS Depth
56+
FROM #Associates;
57+
GO
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*----------------------------------------------------
2+
Scott Peters
3+
https://AdvancedSQLPuzzles.com
4+
5+
Begining at 1, this recursive statement will double
6+
the number for each record... 1, 2, 4, 8. 16, 32.....
7+
8+
*/----------------------------------------------------
9+
10+
---------------------
11+
---------------------
12+
DROP TABLE IF EXISTS #Numbers;
13+
GO
14+
15+
---------------------
16+
---------------------
17+
CREATE TABLE #Numbers
18+
(
19+
Number INTEGER NOT NULL PRIMARY KEY
20+
);
21+
22+
INSERT INTO #Numbers VALUES (1),(2),(3),(4),(5);
23+
GO
24+
25+
---------------------
26+
---------------------
27+
;WITH cte_Numbers AS
28+
(
29+
SELECT *
30+
FROM #Numbers
31+
),
32+
cte_Recursion AS
33+
(
34+
SELECT Number,
35+
CASE WHEN Number = 1 THEN 1 ELSE Number * 2 END AS RunningSum
36+
FROM #Numbers
37+
WHERE Number = 1
38+
UNION ALL
39+
SELECT
40+
t.Number,
41+
(RunningSum * 2) AS RunningSum
42+
FROM cte_Recursion cte
43+
INNER JOIN
44+
cte_Numbers t ON t.Number = (cte.Number + 1)
45+
)
46+
SELECT *
47+
FROM cte_Recursion
48+
ORDER BY Number;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*----------------------------------------------------
2+
Scott Peters
3+
https://AdvancedSQLPuzzles.com
4+
5+
Calcualtes factorials
6+
7+
*/----------------------------------------------------
8+
9+
---------------------
10+
---------------------
11+
DECLARE @vTotalNumbers INTEGER = 10;
12+
13+
---------------------
14+
---------------------
15+
WITH cte_Recursion (Number, Factorial) AS
16+
(
17+
SELECT 1,
18+
1
19+
UNION ALL
20+
SELECT Number + 1 AS Number,
21+
(Number + 1) * Factorial AS Factorial
22+
FROM cte_Recursion
23+
WHERE Number < @vTotalNumbers
24+
)
25+
SELECT Number,
26+
Factorial
27+
FROM cte_Recursion
28+
OPTION (MAXRECURSION 0);--A value of 0 means no limit to the recursion level;
29+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*----------------------------------------------------
2+
Scott Peters
3+
https://AdvancedSQLPuzzles.com
4+
5+
Calculates Fibonacci numbers
6+
7+
*/----------------------------------------------------
8+
9+
WITH cte_Recursion (PrevNumber, Number) AS
10+
(
11+
SELECT 0, 1
12+
UNION ALL
13+
SELECT Number, PrevNumber + Number
14+
FROM cte_Recursion
15+
WHERE Number < 1000000000
16+
)
17+
SELECT PrevNumber AS Fibonacci
18+
FROM cte_Recursion
19+
OPTION (MAXRECURSION 0);
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*----------------------------------------------------
2+
Scott Peters
3+
https://AdvancedSQLPuzzles.com
4+
5+
Displays a running total where the sum cannot go higher than 10 or lower than 0.
6+
7+
*/----------------------------------------------------
8+
9+
10+
DROP TABLE IF EXISTS #Numbers;
11+
GO
12+
13+
CREATE TABLE #Numbers
14+
(
15+
Id INTEGER,
16+
StepNumber INTEGER,
17+
[Count] INTEGER
18+
);
19+
GO
20+
21+
INSERT INTO #Numbers VALUES
22+
(1,1,1)
23+
,(1,2,-2)
24+
,(1,3,-1)
25+
,(1,4,12)
26+
,(1,5,-2)
27+
,(2,1,7)
28+
,(2,2,-3);
29+
GO
30+
31+
WITH cte_Numbers AS
32+
(
33+
SELECT *
34+
FROM #Numbers
35+
),
36+
cte_Recursion AS
37+
(
38+
SELECT Id,
39+
[Count],
40+
[Count] as RunningSum,
41+
CASE WHEN [Count] < 0 THEN 0
42+
WHEN [Count] > 10 THEN 10
43+
ELSE [Count]
44+
END AS RunningSumFloorCap,
45+
StepNumber
46+
FROM #Numbers
47+
WHERE StepNumber = 1
48+
UNION ALL
49+
SELECT cte.ID,
50+
t.[Count],
51+
t.[Count] + cte.[Count],
52+
(CASE WHEN t.[Count] + cte.RunningSumFloorCap < 0 THEN 0
53+
WHEN t.[Count] + cte.RunningSumFloorCap > 10 THEN 10
54+
ELSE t.[Count] + cte.RunningSumFloorCap
55+
END) AS RunningSumFloorCap,
56+
t.StepNumber
57+
FROM cte_Recursion cte
58+
INNER JOIN
59+
cte_Numbers t ON t.StepNumber = (cte.StepNumber + 1) AND t.ID = cte.ID
60+
)
61+
SELECT *
62+
FROM cte_Recursion
63+
ORDER BY ID,
64+
StepNumber;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*----------------------------------------------------
2+
Scott Peters
3+
https://AdvancedSQLPuzzles.com
4+
5+
Same as the STRING_AGG funtion.
6+
Concatenates the values of string expressions and places separator values between them.
7+
8+
*/----------------------------------------------------
9+
10+
-------------------------------
11+
-------------------------------
12+
DROP TABLE IF EXISTS #Example;
13+
GO
14+
15+
-------------------------------
16+
-------------------------------
17+
CREATE TABLE #Example
18+
(
19+
SequenceNumber INTEGER PRIMARY KEY,
20+
String VARCHAR(100)
21+
);
22+
GO
23+
24+
INSERT INTO #Example VALUES
25+
(1,'Hello'),
26+
(2,'World!');
27+
GO
28+
29+
-------------------------------
30+
-------------------------------
31+
WITH
32+
cte_Recursion(String2,Depth) AS
33+
(
34+
SELECT CAST('' AS NVARCHAR(MAX)),
35+
CAST(MAX(SequenceNumber) AS INTEGER)
36+
FROM #Example
37+
UNION ALL
38+
SELECT e.String + ' ' + r.String2, r.Depth - 1
39+
FROM cte_Recursion r INNER JOIN
40+
#Example e ON r.Depth = e.SequenceNumber
41+
)
42+
SELECT String2
43+
FROM cte_Recursion
44+
WHERE Depth = 0;

0 commit comments

Comments
 (0)