sql >> Databasteknik >  >> RDS >> PostgreSQL

Kan någon förklara denna SQL? (och hur kan jag "parametrisera" det och anropa som en funktion?)

Din (förenklade!) funktion kan se ut så här:

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;

Huvudpunkter:

  • Observera att detta är language SQL , alltså inte en PL/pgSQL-funktion. Du kan använda language plpgsql också, men det är inte nödvändigt här.

  • Jag ersatte kärnan i ditt voodoo med fönsterfunktionen rank() , som borde göra exakt samma sak, bara enklare.

  • Jag tog också bort underfrågan helt och hållet. Det är inte nödvändigt.

  • Typen double kallas double precision i PostgreSQL.

  • För att returnera flera rader, definiera en funktion som RETURNS SETOF record eller RETURNS TABLE som jag gjorde.

  • ORDER BY kan använda positionsparametrar, så att du inte behöver skriva ut beräkningen av den första kolumnen igen:ORDER BY 1 .
    Men flera rader i samma grp . Lägg till fler kolumner eller uttryck i ORDER BY klausul för att komma fram till en stabil sorteringsordning.




  1. ORACLE NLS_LANG

  2. Det mest eleganta sättet att generera permutationer i SQL-server

  3. Varför får jag PLS-00302:komponent måste deklareras när den finns?

  4. LIMIT / OFFSET i Oracle 11G