sql >> Database >  >> RDS >> PostgreSQL

Kan iemand deze SQL uitleggen? (en hoe kan ik het 'parametriseren' en aanroepen als een functie?)

Uw (vereenvoudigde!) functie kan er als volgt uitzien:

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;

Belangrijkste punten:

  • Merk op dat dit language SQL is , dus geen PL/pgSQL-functie. Je zou language plpgsql . kunnen gebruiken , ook, maar dat is hier niet nodig.

  • Ik heb de kern van je voodoo vervangen door de vensterfunctie rank() , die precies hetzelfde zou moeten doen, alleen eenvoudiger.

  • Ik heb de subquery ook helemaal verwijderd. Het is niet nodig.

  • Het type double heet double precision in PostgreSQL.

  • Om meerdere rijen te retourneren, definieert u een functie als RETURNS SETOF record of RETURNS TABLE zoals ik deed.

  • ORDER BY kan positionele parameters gebruiken, zodat u de berekening van de eerste kolom niet opnieuw hoeft te spellen:ORDER BY 1 .
    Echter, meerdere rijen in dezelfde grp . Voeg meer kolommen of uitdrukkingen toe aan de ORDER BY clausule om tot een stabiele sorteervolgorde te komen.




  1. Wanneer afbeeldingen opslaan in een database (mySQL) en wanneer niet? (Afbeelding koppelen aan item in database)

  2. MYSQL SELECT-records ouder dan 1 jaar geleden

  3. MySQL Deelnemen aan dezelfde tabel

  4. Statische versus dynamische sql