Gunakan crosstab()
dari modul tablefunc.
SELECT * FROM crosstab(
$$SELECT user_id, user_name, rn, email_address
FROM (
SELECT u.user_id, u.user_name, e.email_address
, row_number() OVER (PARTITION BY u.user_id
ORDER BY e.creation_date DESC NULLS LAST) AS rn
FROM usr u
LEFT JOIN email_tbl e USING (user_id)
) sub
WHERE rn < 4
ORDER BY user_id
$$
, 'VALUES (1),(2),(3)'
) AS t (user_id int, user_name text, email1 text, email2 text, email3 text);
Saya menggunakan kutipan dolar untuk parameter pertama, yang tidak memiliki arti khusus. Lebih mudah untuk menghindari tanda kutip tunggal dalam string kueri, yang merupakan kasus umum:
- Menyisipkan teks dengan tanda kutip tunggal di PostgreSQL
Penjelasan dan instruksi terperinci:
- Kueri Tab Silang PostgreSQL
Dan khususnya, untuk "kolom tambahan":
- Pivot pada Beberapa Kolom menggunakan Tablefunc
Kesulitan khusus ini dia:
-
Kurangnya nama kunci.
--> Kita ganti denganrow_number()
dalam subkueri. -
Jumlah email yang bervariasi.
--> Kami membatasi maksimal. dari tiga di bagian luarSELECT
dan gunakancrosstab()
dengan dua parameter, memberikan daftar kemungkinan kunci.
Perhatikan NULLS LAST
di ORDER BY
.