Di Postgres 11 atau yang lebih baru, gunakan jendela fungsi dengan bingkai khusus dan frame_exclusion
:
SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE CURRENT ROW) AS agg_values
FROM tbl;
Jika name
bukan UNIQUE
, dan karena Anda bertanya:
SELECT *, array_combine(values) OVER (ORDER BY name
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE GROUP) AS agg_values
FROM tbl;
db<>fiddle di sini
Yang pertama (juga) bekerja dengan urutan baris yang berubah-ubah, hanya mengecualikan yang sekarang. Yang kedua membutuhkan ORDER BY
untuk menentukan baris mana yang berada dalam grup yang sama.
Penekanan saya yang berani.
Ini menggunakan fungsi agregat khusus array_combine(anyarray)
disediakan oleh a_horse
.
Atau di sini:
- Memilih data ke dalam array Postgres
- Apakah ada sesuatu seperti fungsi zip() di PostgreSQL yang menggabungkan dua array?