PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Czy ktoś może wyjaśnić ten SQL? (i jak mogę go „sparametryzować” i wywołać jako funkcję?)

Twoja (uproszczona!) funkcja może wyglądać tak:

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;

Główne punkty:

  • Zauważ, że jest to language SQL , a więc nie funkcja PL/pgSQL. Możesz użyć language plpgsql , ale tutaj nie jest to konieczne.

  • Wymieniłem rdzeń twojego voodoo na funkcję okna rank() , który powinien zrobić dokładnie to samo, tylko prostsze.

  • Całkowicie usunąłem też podzapytanie. Nie jest to konieczne.

  • Typ double nazywa się double precision w PostgreSQL.

  • Aby zwrócić wiele wierszy, zdefiniuj funkcję jako RETURNS SETOF record lub RETURNS TABLE tak jak ja.

  • ORDER BY może używać parametrów pozycyjnych, więc nie musisz ponownie przeliterować obliczeń pierwszej kolumny:ORDER BY 1 .
    Jednak wiele wierszy w tym samym grp . Dodaj więcej kolumn lub wyrażeń do ORDER BY klauzula, aby uzyskać stabilną kolejność sortowania.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Popraw wydajność zapytań agregujących PostgresSQL

  2. Skompresowane dzienniki archiwum PostgreSQL w systemie Windows

  3. Czy typ danych Postgres NUMERIC może przechowywać podpisane wartości?

  4. postgresql odpowiednik $mysqli->insert_id

  5. PostgreSQL działa wolno na dużym stole z tablicami i mnóstwem aktualizacji