Pindahkan alamat e-mel pengguna ke dalam lajur untuk menunjukkan rekod terkini
Andaikan anda mempunyai jadual yang menyenaraikan berbilang alamat e-mel untuk setiap pengguna. Matlamatnya adalah untuk menukar e-mel ini ke dalam lajur yang menunjukkan tiga alamat "terbaru" berdasarkan tarikh pembuatannya. Ini akan menghasilkan jadual output yang kelihatan seperti ini:
user_name | user_id | email1 | email2 | email3 |
---|---|---|---|---|
Mary | 123 | [email protected] | [email protected] | [email protected] |
Joe | 345 | [email protected] | (NULL) | (NULL) |
Untuk mencapai transposisi ini, kita boleh menggunakan fungsi tab silang() dalam modul tablefunc:
<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 <= 3 $$, $$SELECT generate_series(1,3)$$ ) AS ct (user_id int, user_name text, email1 text, email2 text, email3 text);</code>
luaran SELECT
mengekstrak data khusus pengguna, mengehadkan keputusan kepada tiga alamat e-mel terbaharu berdasarkan fungsi row_number()
. Fungsi crosstab()
kemudian menukar e-mel ini ke dalam lajur, memastikan nilai yang hilang diwakili sebagai NULL.
Atas ialah kandungan terperinci Bagaimana untuk Memindahkan Alamat E-mel Pengguna ke Lajur Hanya Menunjukkan Tiga Yang Terbaru?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!