sql >> Databáze >  >> RDS >> PostgreSQL

Může někdo vysvětlit toto SQL? (a jak to mohu „parametrizovat“ a vyvolat jako funkci?)

Vaše (zjednodušeně!) funkce by mohla vypadat takto:

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;

Hlavní body:

  • Upozorňujeme, že toto je language SQL , takže ne funkce PL/pgSQL. Můžete použít language plpgsql , ale to zde není nutné.

  • Jádro vašeho voodoo jsem nahradil funkce okna rank() , který by měl dělat totéž, jen jednodušší.

  • Poddotaz jsem také úplně odstranil. Není to nutné.

  • Typ double se nazývá double precision v PostgreSQL.

  • Chcete-li vrátit více řádků, definujte funkci jako RETURNS SETOF record nebo RETURNS TABLE jako já.

  • ORDER BY může používat poziční parametry, takže nemusíte znovu vypisovat výpočet prvního sloupce:ORDER BY 1 .
    Nicméně více řádků ve stejném grp . Přidejte další sloupce nebo výrazy do ORDER BY klauzule k dosažení stabilního pořadí řazení.




  1. Vložit více dat do MySQL a aktualizovat, pokud existují

  2. Django migrate:nevytváří tabulky

  3. Nápověda k odstraňování problémů SqlException:Časový limit vypršel při připojení, v situaci bez zatížení

  4. Prahové hodnoty optimalizace – seskupování a agregace dat, část 5