-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFibonacci-by-RECURSIVE SQL.sql
More file actions
47 lines (45 loc) · 1.38 KB
/
Copy pathFibonacci-by-RECURSIVE SQL.sql
File metadata and controls
47 lines (45 loc) · 1.38 KB
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
DROP FUNCTION fib;
CREATE FUNCTION fib(n numeric)
RETURNS TABLE(i numeric, "fib(i)" numeric) AS
$$
WITH RECURSIVE
fibs(iter, i, fib) AS(
SELECT 0 AS iter,
fi.i::numeric AS i,
(fi.pos-1)::numeric AS fib
FROM generate_series (0, (CASE n::integer
WHEN 0
THEN 0
ELSE 1
END )) WITH ORDINALITY AS fi(i, pos)
UNION ALL
(-- prepare for multiple references
-- to the recursive table fibs
WITH fibs(iter, i, fib) AS(
TABLE fibs -- reinject already discovered fibs
)
SELECT f.iter+1 AS iter, f.i, f.fib
FROM (TABLE fibs
UNION
SELECT f.iter AS iter,
(f.iter + 2)::numeric AS i,
(NTH_VALUE(f.fib, f.iter+2)OVER() + NTH_VALUE(f.fib, f.iter+1)OVER()) AS fib
FROM ( SELECT f.*
FROM fibs AS f
ORDER BY f.i
) AS f
) AS f (iter, i, fib)
WHERE f.iter < n-1
)
),
--Post-processing
fib (i, fib) AS(
SELECT f.i AS i, f.fib AS "fib(i)"
FROM fibs AS f
WHERE f.iter = n-1
ORDER BY f.iter, f.i
)
TABLE fib;
$$ LANGUAGE SQL IMMUTABLE;
SELECT f.*
FROM fib(10) AS f