PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Kann jemand dieses SQL erklären? (und wie kann ich es "parametrieren" und als Funktion aufrufen?)

Ihre (vereinfachte!) Funktion könnte so aussehen:

CREATE OR REPLACE FUNCTION my_custom_grouping(integer)
RETURNS TABLE (
   grp integer,
   col1 double precision,
   col2 double precision,
   col3 double precision,
   col4 double precision,
   col5 double precision,
   col6 double precision,
   col7 double precision) AS
$BODY$
    SELECT ceil(rank() OVER (ORDER BY col1) / $1)::int as grp
          ,col1, col2, col3, col4, col5, col6, col7
    FROM   mytable 
    ORDER  BY 1;
$BODY$ LANGUAGE SQL;

Hauptpunkte:

  • Beachten Sie, dass dies language SQL ist , also keine PL/pgSQL-Funktion. Sie könnten language plpgsql verwenden , aber das ist hier nicht nötig.

  • Ich habe den Kern Ihres Voodoo durch die Fensterfunktion rank() , was genau dasselbe tun sollte, nur einfacher.

  • Ich habe auch die Unterabfrage ganz entfernt. Es ist nicht notwendig.

  • Der Typ double heißt double precision in PostgreSQL.

  • Um mehrere Zeilen zurückzugeben, definieren Sie eine Funktion als RETURNS SETOF record oder RETURNS TABLE wie ich.

  • ORDER BY kann Positionsparameter verwenden, sodass Sie die Berechnung der ersten Spalte nicht erneut buchstabieren müssen:ORDER BY 1 .
    Allerdings mehrere Zeilen in derselben grp . Fügen Sie dem ORDER BY weitere Spalten oder Ausdrücke hinzu -Klausel, um zu einer stabilen Sortierreihenfolge zu gelangen.