PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Alguém pode explicar esse SQL? (e como posso 'parametrizá-lo' e invocar como uma função?)


Sua função (simplificada!) pode ficar assim:
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;

Pontos principais:


  • Observe que este é language SQL , portanto, não é uma função PL/pgSQL. Você pode usar language plpgsql , também, mas isso não é necessário aqui.

  • Substituí o núcleo do seu voodoo pelo função de janela rank() , que deve fazer exatamente o mesmo, apenas mais simples.

  • Eu também removi a subconsulta completamente. Não é necessário.

  • O tipo double é chamado de double precision no PostgreSQL.

  • Para retornar várias linhas, defina uma função como RETURNS SETOF record ou RETURNS TABLE como eu fiz.

  • ORDER BY pode usar parâmetros posicionais, então você não precisa soletrar o cálculo da primeira coluna novamente:ORDER BY 1 .
    No entanto, várias linhas no mesmo grp . Adicione mais colunas ou expressões ao ORDER BY cláusula para chegar a uma ordem de classificação estável.