PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Adakah yang bisa menjelaskan SQL ini? (dan bagaimana saya bisa 'memparametrikannya' dan memanggilnya sebagai fungsi?)

Fungsi Anda (disederhanakan!) dapat terlihat seperti ini:

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;

Poin utama:

  • Perhatikan bahwa ini adalah language SQL , jadi bukan fungsi PL/pgSQL. Anda bisa menggunakan language plpgsql , juga, tapi itu tidak perlu di sini.

  • Saya mengganti inti voodoo Anda dengan fungsi jendela rank() , yang seharusnya melakukan hal yang sama persis, hanya saja lebih sederhana.

  • Saya juga menghapus subquery sama sekali. Itu tidak perlu.

  • Jenis double disebut double precision di PostgreSQL.

  • Untuk mengembalikan beberapa baris, tentukan fungsi sebagai RETURNS SETOF record atau RETURNS TABLE seperti yang saya lakukan.

  • ORDER BY dapat menggunakan parameter posisi, sehingga Anda tidak perlu lagi mengeja perhitungan kolom pertama:ORDER BY 1 .
    Namun, beberapa baris dalam grp yang sama . Tambahkan lebih banyak kolom atau ekspresi ke ORDER BY klausa untuk sampai pada urutan pengurutan yang stabil.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ubah tipe data kolom menjadi serial

  2. DENGARKAN/BERITAHU pgconnection turun java?

  3. Jenis kolom PostgreSQL mana yang harus digunakan untuk menyimpan Java BigDecimal?

  4. Tampilan hasil permintaan klien PSQL 8.3+

  5. Bagaimana cara deserialize nilai BigDecimal yang diterima dari broker kafka melalui mekanisme debezium CDC?