PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Може ли някой да обясни този SQL? (и как мога да го „параметризирам“ и да го извикам като функция?)

Вашата (опростена!) функция може да изглежда така:

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;

Основни точки:

  • Имайте предвид, че това е language SQL , така че не е PL/pgSQL функция. Можете да използвате language plpgsql , но това не е необходимо тук.

  • Замених ядрото на вашето вуду с прозоречната функция rank() , което трябва да прави точно същото, само по-просто.

  • Също така премахнах напълно подзаявката. Не е необходимо.

  • Типът double се нарича double precision в PostgreSQL.

  • За да върнете няколко реда, дефинирайте функция като RETURNS SETOF record или RETURNS TABLE както направих аз.

  • ORDER BY може да използва позиционни параметри, така че не е необходимо да изписвате отново изчислението на първата колона:ORDER BY 1 .
    Въпреки това, множество редове в един и същ grp . Добавете още колони или изрази към ORDER BY клауза за постигане на стабилен ред на сортиране.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да увеличим максималните връзки в postgres?

  2. postgres използва само сортиран индекс за запитване към таблица с 5m записи

  3. .Net PostgreSQL низ за връзка

  4. Оператор ALL в клауза WHERE в Rails

  5. Динамична централна заявка с помощта на PostgreSQL 9.3