sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Alguien puede explicar este SQL? (¿y cómo puedo 'parametrizarlo' e invocarlo como una función?)

Su función (¡simplificada!) podría verse así:

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;

Puntos principales:

  • Tenga en cuenta que esto es language SQL , por lo que no es una función PL/pgSQL. Podrías usar language plpgsql , también, pero eso no es necesario aquí.

  • Reemplacé el núcleo de tu vudú con la función de ventana rank() , que debería hacer exactamente lo mismo, solo que más simple.

  • También eliminé la subconsulta por completo. No es necesario.

  • El tipo double se llama double precision en PostgreSQL.

  • Para devolver varias filas, defina una función como RETURNS SETOF record o RETURNS TABLE como yo lo hice.

  • ORDER BY puede usar parámetros posicionales, por lo que no tiene que volver a deletrear el cálculo de la primera columna:ORDER BY 1 .
    Sin embargo, múltiples filas en el mismo grp . Agregue más columnas o expresiones al ORDER BY cláusula para llegar a un orden de clasificación estable.