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

Kan nogen forklare denne SQL? (og hvordan kan jeg 'parametrisere' det og påberåbe som en funktion?)

Din (forenklede!) funktion kunne se sådan ud:

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;

Vigtigste punkter:

  • Bemærk, at dette er language SQL , så ikke en PL/pgSQL-funktion. Du kan bruge language plpgsql også, men det er ikke nødvendigt her.

  • Jeg erstattede kernen af ​​dit voodoo med vinduefunktionen rank() , som burde gøre præcis det samme, bare enklere.

  • Jeg fjernede også underforespørgslen helt. Det er ikke nødvendigt.

  • Typen double kaldes double precision i PostgreSQL.

  • For at returnere flere rækker skal du definere en funktion som RETURNS SETOF record eller RETURNS TABLE som jeg gjorde.

  • ORDER BY kan bruge positionsparametre, så du ikke behøver at stave beregningen af ​​den første kolonne igen:ORDER BY 1 .
    Men flere rækker i samme grp . Tilføj flere kolonner eller udtryk til ORDER BY klausul for at nå frem til en stabil sorteringsrækkefølge.




  1. Hvordan retter jeg fejlen 'Named Pipes Provider, fejl 40 - Kunne ikke åbne en forbindelse til' SQL Server'?

  2. Bestem det næste tal i databaseforespørgslen med while loop i php

  3. Sådan undgår du, at aktivitetsmonitor skader din SQL-servers ydeevne

  4. Sådan forhindrer du mysql implicit commit