Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memindahkan Tiga E-mel Pengguna Terkini ke dalam Lajur dalam PostgreSQL?
Menggunakan crosstab()
untuk Pivot E-mel Pengguna Terkini dalam PostgreSQL
Cabaran: Anda perlu menukar jadual dengan berbilang e-mel pengguna kepada format yang mana tiga e-mel terbaharu untuk setiap pengguna dipaparkan sebagai lajur berasingan.
Penyelesaian: Fungsi crosstab()
PostgreSQL (daripada sambungan tablefunc
) menyediakan penyelesaian yang cekap. Pendekatan ini melibatkan langkah-langkah utama berikut:
<code class="language-sql">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);</code>
Pecahan:
Subquery: Subquery menyusun e-mel untuk setiap pengguna berdasarkan creation_date
menggunakan ROW_NUMBER()
. NULLS LAST
memastikan tarikh penciptaan NULL dikendalikan dengan sewajarnya.
Penapisan: Klausa WHERE rn < 4
mengehadkan keputusan kepada tiga e-mel terbaharu bagi setiap pengguna.
crosstab()
Fungsi: Fungsi crosstab()
memaksi data e-mel terperingkat. Parameter VALUES (1),(2),(3)
mentakrifkan tiga lajur output (email1
, email2
, email3
).
Output: Pertanyaan terakhir mengembalikan jadual dengan user_id
, user_name
dan tiga alamat e-mel terbaharu sebagai lajur berasingan.
Kaedah ini mengendalikan transposisi dengan cekap, menyediakan penyelesaian yang jelas dan ringkas untuk mengekstrak data e-mel terbaharu. Ingat untuk mendayakan sambungan tablefunc
jika ia belum didayakan dalam pangkalan data PostgreSQL anda.
Atas ialah kandungan terperinci Bagaimana untuk Memindahkan Tiga E-mel Pengguna Terkini ke dalam Lajur dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!