/*********************************************************** * Fakultät ***********************************************************/ -- Mit Hilfe einer rekursiven View kann einer -- virtuelle Fakultätstabelle definiert werden. WITH RECURSIVE fak(n,f) AS ( VALUES(0,1) UNION SELECT n+1, (n+1)*f FROM fak ) SELECT n,f FROM fak FETCH FIRST 13 ROWS ONLY ; -- FETCH FIRST 14 ROWS ONLY -- FEHLER: integer ist außerhalb des gültigen Bereichs -- Allerdings kann man damit nur die Werte -- 0! bis 12! ermitteln, da die größte -- Integerzahl in Postgres gleich 2147483647 ist. WITH RECURSIVE fak(n,f) AS ( VALUES(0, 1::BIGINT) UNION SELECT n+1, (n+1)*f FROM fak ) SELECT n,f FROM fak FETCH FIRST 21 ROWS ONLY ; -- FETCH FIRST 22 ROWS ONLY -- FEHLER: bigint ist außerhalb des gültigen Bereichs -- Mit BIGINT-Werten kommt man immerhin bis 20!. -- Der größte BIGINT-Wert in Postgres ist 223372036854775807. WITH RECURSIVE fak(n,f) AS ( VALUES(0, 1::NUMERIC) UNION SELECT n+1, (n+1)*f FROM fak ) SELECT n,f FROM fak FETCH FIRST 1000 ROWS ONLY ; WITH RECURSIVE fak(n,f) AS ( VALUES(0, 1::NUMERIC) UNION SELECT n+1, (n+1)*f FROM fak ) SELECT n,f FROM fak OFFSET 32177 FETCH FIRST ROW ONLY ; -- OFFSET 32178 FETCH FIRST ROW ONLY -- FEHLER: Wert verursacht Überlauf im »numeric«-Format -- Mit NUMERIC-Werten kommt man immerhin bis 32177!. -- In Postgres kann ein NUMERIC-Wert aus bis zu -- 131072 Ziffern bestehen. -- Da die Berechnung der verschiedenen Fakulätswerte gerade -- bei größeren Werten zeitaufwändig ist, kann man die Werte -- vorgerechnen und in einer "MARERIALIZED VIEW" abspeichern. /* ********************************************************** * ACHTUNG: NICHT AUSFÜHREN * (sonst Speicherplatzmagel auf Praktikumsserver) ********************************************************** DROP MATERIALIZED VIEW IF EXISTS fakultaet; CREATE MATERIALIZED VIEW fakultaet(n,f) AS WITH RECURSIVE fak(n,f) AS ( VALUES(0, 1::NUMERIC) UNION SELECT n+1, (n+1)*f FROM fak ) SELECT n,f FROM fak FETCH FIRST 32178 ROWS ONLY ; SELECT f FROM fakultaet WHERE n = 1000; SELECT n, f FROM fakultaet WHERE n BETWEEN 32170 AND 32177; */ -- Da sich die Werte sicher nie ändern, kann man auch eine -- normale Tabelle verwenden. (Bei einer MATERIALIZED VIEW -- könnte man eine Neuberechnung der Tabelle jederzeit -- mit dem Befehl -- REFRESH MATERIALIZED VIEW fakultaet -- erzwingen. Das wird hier jedoch gar nicht benötigt.) /* ********************************************************** * ACHTUNG: NICHT AUSFÜHREN * (sonst Speicherplatzmagel auf Praktikumsserver) ********************************************************** DROP TABLE IF EXISTS fakultaet2; CREATE TABLE fakultaet2 (n INTEGER PRIMARY KEY, f NUMERIC ); INSERT INTO fakultaet2(n,f) WITH RECURSIVE fak(n,f) AS ( VALUES(0, 1::NUMERIC) UNION SELECT n+1, (n+1)*f FROM fak ) SELECT n,f FROM fak FETCH FIRST 32178 ROWS ONLY ; SELECT f FROM fakultaet2 WHERE n = 1000; SELECT n, f FROM fakultaet2 WHERE n BETWEEN 32170 AND 32177; */ -- In Postgres kann man auch eine Funktion zur Berechnung -- der Fakultät definieren. CREATE OR REPLACE FUNCTION faculty_slow(n INTEGER) RETURNS NUMERIC AS $_SQL_$ WITH RECURSIVE fak(i,f) AS ( VALUES(0, 1::NUMERIC) UNION SELECT i+1, (i+1)*f FROM fak WHERE i+1 <= n ) SELECT f FROM fak WHERE i = n $_SQL_$ LANGUAGE SQL IMMUTABLE ; SELECT faculty_slow(50); /* -- Effizienter ist es, wenn man die MATERIALIZED VIEW fakultaet -- (oder die Tabelle faultaet2) zur "Berechnung" verwendet. CREATE OR REPLACE FUNCTION faculty(INTEGER) RETURNS NUMERIC -- Man beachte: Einen Parameter namens 'n' (wie zuvor) -- kann es nicht geben, es in der VIEW fakultaet schon -- ein Attribut mit diesem Namen gibt und man daher -- in der SQL-Anfrage die AS $_SQL_$ SELECT f FROM fakultaet WHERE n = $1; $_SQL_$ LANGUAGE SQL IMMUTABLE ; SELECT faculty(32177); */ -- Sicherheitshalber werden die beiden Cache-Tabellen -- noch einmal gelöscht! DROP TABLE IF EXISTS fakultaet2; DROP MATERIALIZED VIEW IF EXISTS fakultaet; /*********************************************************** * Fibonacci ***********************************************************/ WITH RECURSIVE fib(a,b) AS ( VALUES(0,1) UNION SELECT b, a + b FROM fib ) SELECT a FROM fib FETCH FIRST 46 ROWS ONLY; -- FETCH FIRST 47 ROWS ONLY; -- FEHLER: integer ist außerhalb des gültigen Bereichs WITH RECURSIVE fib(a,b) AS ( VALUES(0::BIGINT,1::BIGINT) UNION SELECT b, a + b FROM fib ) SELECT a FROM fib FETCH FIRST 92 ROWS ONLY; -- ETCH FIRST 93 ROWS ONLY; -- FEHLER: bigint ist außerhalb des gültigen Bereichs WITH RECURSIVE fib(a,b) AS ( VALUES(0::NUMERIC,1::NUMERIC) UNION SELECT b, a + b FROM fib ) SELECT a FROM fib FETCH FIRST 1000 ROWS ONLY; WITH RECURSIVE fib(a,b) AS ( VALUES(0::NUMERIC,1::NUMERIC) UNION SELECT b, a + b FROM fib ) SELECT a FROM fib OFFSET 100000 FETCH NEXT 10 ROWS ONLY; -- Funktioniert immer noch!!! /*********************************************************** * Anzahl der Reiskörner auf einem Schachbrett. ***********************************************************/ SELECT feld, koerner_einzeln, SUM(koerner_einzeln) OVER (ORDER BY feld) AS koerner_summe FROM ( WITH RECURSIVE reis AS (SELECT 1 AS feld, 1::DECIMAL AS koerner_einzeln UNION ALL SELECT feld+1, koerner_einzeln*2 FROM reis WHERE feld < 64 ) SELECT * FROM reis ) AS rekursion ; /*********************************************************** * Mandelbrot-Menge ***********************************************************/ -- Im Postgres-Wiki findet sich eine schöne rekursive Funktion -- zum Berechnen einer Mandelbrot-ASCII-Grafik: -- https://wiki.postgresql.org/wiki/Mandelbrot_set WITH RECURSIVE x(i) AS ( VALUES(0) UNION ALL SELECT i + 1 FROM x WHERE i < 101 ), Z(Ix, Iy, Cx, Cy, X, Y, I) AS ( SELECT Ix, Iy, X::FLOAT, Y::FLOAT, X::FLOAT, Y::FLOAT, 0 FROM (SELECT -2.2 + 0.031 * i, i FROM x) AS xgen(X,Ix) CROSS JOIN (SELECT -1.5 + 0.031 * i, i FROM x) AS ygen(Y,Iy) UNION ALL SELECT Ix, Iy, Cx, Cy, X * X - Y * Y + Cx AS X, Y * X * 2 + Cy, I + 1 FROM Z WHERE X * X + Y * Y < 16.0 AND I < 27 ), Zt (Ix, Iy, I) AS ( SELECT Ix, Iy, MAX(I) AS I FROM Z GROUP BY Iy, Ix ORDER BY Iy, Ix ) SELECT array_to_string(array_agg(SUBSTRING(' .,,,-----++++%%%%@@@@#### ', GREATEST(I,1), 1 ) ), '' ) FROM Zt GROUP BY Iy ORDER BY Iy; /* .................................................................................... ....................................................................................... ......................................................................................... ........................................................................................... ....................................................,,,,,,,,,................................. ................................................,,,,,,,,,,,,,,,,,,............................. ..............................................,,,,,,,,,,,,,,,,,,,,,,,,.......................... ............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,........................ ..........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...................... .........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.................... ........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,................... .......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,................. .......................................,,,,,,,,,,,,,,,,,,,,,,,,--,,,,,,,,,,,,,,,,,,,,................ ......................................,,,,,,,,,,,,,,,,,,,,,,,,,,-+--,,,,,,,,,,,,,,,,,,,............... ....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----,,,,,,,,,,,,,,,,,,,.............. ...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,--- -----,,,,,,,,,,,,,,,,,............. .................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---++--++,,,,,,,,,,,,,,,,,,............ ................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----%++---,,,,,,,,,,,,,,,,,............ ..............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----+%----,,,,,,,,,,,,,,,,,,........... .............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----- %%+----,,,,,,,,,,,,,,,,,,.......... ...........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---%-+% ----,,,,,,,,,,,,,,,,,,,......... ..........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---+ +## %+%---,,,,,,,,,,,,,,,,,,......... ........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----# # +---,,,,,,,,,,,,,,,,,,........ .......................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------% %-----,,,,,,,,,,,,,,,,,........ .....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---------+ ------,,,,,,,,,,,,,,,,,....... ....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----------+@ +-----------,,,,,,,,,,,,....... ..................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----@-------++ ++-----------,,,,,,,,,,,,...... .................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--+@% ---+ +@%%@ %%+@+@%------+-,,,,,,,,,,,...... ................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---- # ++% % @-----++--,,,,,,,,,,,..... ..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----+ % %%++ %+%@-,,,,,,,,,,,..... .............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----+# #% ++-,,,,,,,,,,,,.... ............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------+ @---,,,,,,,,,,,,.... ..........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------++% ---,,,,,,,,,,,,.... .........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------+ + %+---,,,,,,,,,,,,,... ........,,,,,,,,,,,,,,,,,,,,,--------------------@ +----,,,,,,,,,,,,... .......,,,,,,,,,,,,,,,,,,,,,,- +-----------------+ ----,,,,,,,,,,,,... .......,,,,,,,,,,,,,,,,,,,,,--++------+---------+% +++--,,,,,,,,,,,,.. ......,,,,,,,,,,,,,,,,,,,,,,--%+-----++--------- #+-,,,,,,,,,,,,.. .....,,,,,,,,,,,,,,,,,,,,,,----#%++--+@ -+-----+% --,,,,,,,,,,,,.. .....,,,,,,,,,,,,,,,,,,,,,,-----+## ++@ + +----% +--,,,,,,,,,,,,,.. ....,,,,,,,,,,,,,,,,,,,,,,------+@ @ @@++++# +--,,,,,,,,,,,,,.. ....,,,,,,,,,,,,,,,,,,,,,-------% #++% -,,,,,,,,,,,,,.. ...,,,,,,,,,,,,,,,,,,,,,------++%# %%@ %-,,,,,,,,,,,,,,. ...,,,,,,,,,,,,,,,,,,,--------+ % +--,,,,,,,,,,,,,,. ...,,,,,,,,,,,,,,,,,,-----+--++@ # --,,,,,,,,,,,,,,. ..,,,,,,,,,,,,,,,,,-------%+++% @--,,,,,,,,,,,,,,,. ..,,,,,,,,,,,-------------+ @#@ ---,,,,,,,,,,,,,,,. ..,,,,,,,,,---@--------@-+% +---,,,,,,,,,,,,,,,. ..,,,,,------- +-++++-+%%% +----,,,,,,,,,,,,,,,. ..,,,,,,------%--------++% +----,,,,,,,,,,,,,,,. ..,,,,,,,,,,--+----------++# ---,,,,,,,,,,,,,,,. ..,,,,,,,,,,,,------------+@@@% +--,,,,,,,,,,,,,,,. ..,,,,,,,,,,,,,,,,,------- +++% %--,,,,,,,,,,,,,,,. ...,,,,,,,,,,,,,,,,,,---------+@ @ --,,,,,,,,,,,,,,. ...,,,,,,,,,,,,,,,,,,,,------- # %@ +--,,,,,,,,,,,,,,. ...,,,,,,,,,,,,,,,,,,,,,-------++@ %+ %-,,,,,,,,,,,,,,. ....,,,,,,,,,,,,,,,,,,,,,------- %++% %-,,,,,,,,,,,,,.. ....,,,,,,,,,,,,,,,,,,,,,,------+# %# #@ ++++ +--,,,,,,,,,,,,,.. .....,,,,,,,,,,,,,,,,,,,,,,-----+ %%++% +@+----+ +--,,,,,,,,,,,,,.. .....,,,,,,,,,,,,,,,,,,,,,,,---%+++--+#+--------% #--,,,,,,,,,,,,.. ......,,,,,,,,,,,,,,,,,,,,,,--++-----%%--------- @#--,,,,,,,,,,,,.. .......,,,,,,,,,,,,,,,,,,,,,---------------------+@ +-++,,,,,,,,,,,,... ........,,,,,,,,,,,,,,,,,,,,,--------------------+ ----,,,,,,,,,,,,... .........,,,,,,,,,,,,,,,,,,,,----,,,------------- #+----,,,,,,,,,,,,... ..........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------+ + +---,,,,,,,,,,,,,... ...........,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------+%# #---,,,,,,,,,,,,.... ............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,------+# @ @---,,,,,,,,,,,,.... .............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----+# + @--,,,,,,,,,,,,.... ..............,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---+% %+@ %+-+ +++%-,,,,,,,,,,,..... ................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----% %@++ # % -----++-,,,,,,,,,,,,..... .................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-- ++ ---+ + +%@ %++++++------%-,,,,,,,,,,,...... ...................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---- -------++ +------------,,,,,,,,,,,,...... ....................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----------+% +--------,,,,,,,,,,,,,,,....... ......................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------+# -----,,,,,,,,,,,,,,,,,,....... .......................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-------+ #----,,,,,,,,,,,,,,,,,,........ .........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,----+% %#---,,,,,,,,,,,,,,,,,,,........ ..........................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---+%+%@ %+%%--,,,,,,,,,,,,,,,,,,......... ............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---+-+% %----,,,,,,,,,,,,,,,,,,.......... .............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----+%@+---,,,,,,,,,,,,,,,,,,,.......... ...............................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----+%----,,,,,,,,,,,,,,,,,,........... ................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,-----%+ +--,,,,,,,,,,,,,,,,,............ ..................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,---++----,,,,,,,,,,,,,,,,,............. ...................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,---@-----,,,,,,,,,,,,,,,,,............. .....................................,,,,,,,,,,,,,,,,,,,,,,,,,,,-----,,,,,,,,,,,,,,,,,,,.............. .....................................,,,,,,,,,,,,,,,,,,,,,,,,,,--%,,,,,,,,,,,,,,,,,,,,............... .......................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,................. ........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.................. ........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,................... .........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.................... ..........................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...................... ............................................,,,,,,,,,,,,,,,,,,,,,,,,,,,,........................ .............................................,,,,,,,,,,,,,,,,,,,,,,,,.......................... ................................................,,,,,,,,,,,,,,,,,............................. .....................................................,,,,.................................... ........................................................................................... ......................................................................................... ...................................................................................... .................................................................................... ................................................................................. .............................................................................. ........................................................................... ........................................................................ */