PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Ai đó có thể giải thích SQL này không? (và làm cách nào để tôi có thể 'tham số hóa' nó và gọi dưới dạng một hàm?)

Hàm (được đơn giản hóa!) Của bạn có thể trông giống như sau:

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;

Những điểm chính:

  • Lưu ý rằng đây là language SQL , vì vậy không phải là một hàm PL / pgSQL. Bạn có thể sử dụng language plpgsql , nhưng điều đó không cần thiết ở đây.

  • Tôi đã thay thế cốt lõi của voodoo của bạn bằng chức năng cửa sổ rank() , điều này sẽ thực hiện tương tự chính xác, chỉ đơn giản hơn.

  • Tôi cũng đã xóa hoàn toàn truy vấn con. Nó không cần thiết.

  • Loại double được gọi là double precision trong PostgreSQL.

  • Để trả về nhiều hàng, hãy xác định một hàm dưới dạng bản ghi RETURNS SETOF record hoặc RETURNS TABLE như tôi đã làm.

  • ORDER BY có thể sử dụng các tham số vị trí, vì vậy bạn không phải viết lại phép tính của cột đầu tiên:ORDER BY 1 .
    Tuy nhiên, nhiều hàng trong cùng một grp . Thêm các cột hoặc biểu thức khác vào ORDER BY mệnh đề để đạt được thứ tự sắp xếp ổn định.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django:NotImplementedError:annotate () + diff (các trường) không được triển khai

  2. Cách tạo Pivot Table trong PostgreSQL

  3. Lỗi khi mở pgAdmin 4 trên mac

  4. pgAgent job không thành công với lỗi xác thực

  5. Để bỏ qua kết quả BEFORE TRIGGER của PostgreSQL?