- Gunakan
COALESCE
seperti yang disediakan @Justin. -
Dengan
first_value()
/last_value()
Anda membutuhkan untuk menambahkanORDER 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 menambahkanORDER BY
, bingkai jendela default berakhir di baris saat ini , dan Anda perlu membuat huruf besarlast_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