PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Quelqu'un peut-il expliquer ce SQL? (et comment puis-je le "paramétrer" et l'invoquer en tant que fonction ?)

Votre fonction (simplifiée !) pourrait ressembler à ceci :

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;

Points majeurs :

  • Notez qu'il s'agit du language SQL , donc pas une fonction PL/pgSQL. Vous pouvez utiliser language plpgsql , aussi, mais ce n'est pas nécessaire ici.

  • J'ai remplacé le noyau de votre vaudou par la fonction de fenêtre rank() , qui devrait faire exactement la même chose, juste plus simple.

  • J'ai également supprimé complètement la sous-requête. Ce n'est pas nécessaire.

  • Le type double est appelé double precision dans PostgreSQL.

  • Pour renvoyer plusieurs lignes, définissez une fonction comme RETURNS SETOF record ou RETURNS TABLE comme je l'ai fait.

  • ORDER BY peut utiliser des paramètres de position, vous n'avez donc pas à épeler à nouveau le calcul de la première colonne :ORDER BY 1 .
    Toutefois, plusieurs lignes dans le même grp . Ajouter plus de colonnes ou d'expressions au ORDER BY clause pour arriver à un ordre de tri stable.