PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Qualcuno può spiegare questo SQL? (e come posso "parametrizzarlo" e invocarlo come funzione?)

La tua funzione (semplificata!) potrebbe assomigliare a questa:

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;

Punti principali:

  • Nota che questo è language SQL , quindi non una funzione PL/pgSQL. Potresti usare language plpgsql anche , ma qui non è necessario.

  • Ho sostituito il nucleo del tuo voodoo con la funzione finestra rank() , che dovrebbe fare esattamente lo stesso, solo più semplice.

  • Ho anche rimosso del tutto la sottoquery. Non è necessario.

  • Il tipo double si chiama double precision in PostgreSQL.

  • Per restituire più righe, definisci una funzione come RETURNS SETOF record o RETURNS TABLE come ho fatto io.

  • ORDER BY può utilizzare parametri posizionali, quindi non è necessario precisare nuovamente il calcolo della prima colonna:ORDER BY 1 .
    Tuttavia, più righe nello stesso grp . Aggiungi più colonne o espressioni a ORDER BY clausola per arrivare a un ordinamento stabile.