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

Cara menggunakan struktur data cincin di fungsi jendela

  • Gunakan COALESCE seperti yang disediakan @Justin.
  • Dengan first_value() / last_value() Anda membutuhkan untuk menambahkan ORDER BY klausa ke definisi jendela atau urutannya tidak ditentukan . Anda beruntung dalam contoh ini, karena baris-baris tersebut berurutan tepat setelah membuat tabel dummy.
    Setelah Anda menambahkan ORDER BY , bingkai jendela default berakhir di baris saat ini , dan Anda perlu membuat huruf besar last_value() panggil - atau kembalikan urutan pengurutan dalam bingkai jendela seperti yang ditunjukkan pada contoh pertama saya.

  • Saat menggunakan kembali definisi jendela beberapa kali, WINDOW . eksplisit klausa sangat menyederhanakan sintaks:

SELECT ring, part, ARRAY[
          coalesce(
             lag(part) OVER w
            ,first_value(part) OVER (PARTITION BY ring ORDER BY part DESC))
         ,part
         ,coalesce(
             lead(part) OVER w
            ,first_value(part) OVER w)
         ] AS neighbours
FROM   rp
WINDOW w AS (PARTITION BY ring ORDER BY part);

Lebih baik lagi , gunakan kembali definisi jendela yang sama, sehingga Postgres dapat menghitung semua nilai dalam sekali pemindaian. Agar ini berfungsi, kita perlu mendefinisikan bingkai jendela khusus :

SELECT ring, part, ARRAY[
          coalesce(
             lag(part) OVER w
            ,last_value(part) OVER w)
         ,part
         ,coalesce(
             lead(part) OVER w
            ,first_value(part) OVER w)
         ] AS neighbours
FROM   rp
WINDOW w AS (PARTITION BY ring
             ORDER BY part
             RANGE BETWEEN UNBOUNDED PRECEDING
                       AND UNBOUNDED FOLLOWING)
ORDER  BY 1,2;

Anda bahkan dapat menyesuaikan definisi bingkai untuk setiap panggilan fungsi jendela:

SELECT ring, part, ARRAY[
          coalesce(
             lag(part) OVER w
            ,last_value(part) OVER (w RANGE BETWEEN CURRENT ROW
                                                AND UNBOUNDED FOLLOWING))
         ,part
         ,coalesce(
             lead(part) OVER w
            ,first_value(part) OVER w)
         ] AS neighbours
FROM   rp
WINDOW w AS (PARTITION BY ring ORDER BY part)
ORDER  BY 1,2;

Mungkin lebih cepat untuk cincin dengan banyak bagian. Anda harus menguji.

SQL Fiddle mendemonstrasikan ketiganya dengan kasus uji yang ditingkatkan. Pertimbangkan rencana kueri.

Selengkapnya tentang definisi bingkai jendela:

  • Dalam manual.
  • Fungsi jendela PostgreSQL:partisi sebagai perbandingan
  • Kueri PostgreSQL dengan tanggal maks dan min ditambah id terkait per baris


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara saya menulis data dari tabel R ke PostgreSQL dengan kunci utama peningkatan otomatis?

  2. Bagaimana cara menginstal libpq-fe.h?

  3. Bagaimana cara menghentikan/membunuh kueri di postgresql?

  4. Apakah PostgreSQL mendukung pengumpulan aksen yang tidak sensitif?

  5. Apakah nama kolom PostgreSQL peka huruf besar/kecil?