Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Memindahkan Data Baris E-mel Pengguna ke Lajur dalam PostgreSQL?

Bagaimana untuk Memindahkan Data Baris E-mel Pengguna ke Lajur dalam PostgreSQL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-10 16:02:41447semak imbas

How to Transpose Row Data of User Emails into Columns in PostgreSQL?

Tukar data baris ke dalam lajur: paparkan alamat e-mel terkini pengguna

Soalan:

Anda mempunyai berbilang alamat e-mel bagi setiap pengguna dalam jadual anda dan anda mahu meratakannya ke dalam lajur supaya ia memaparkan tiga alamat e-mel terbaharu untuk setiap pengguna berdasarkan tarikh penciptaan.

Keluaran yang dijangkakan:

user_name user_id email1 email2 email3
Mary 123 [email protected] [email protected] [email protected]
Joe 345 [email protected] NULL NULL

Penyelesaian:

Untuk melakukan ini, anda boleh memanfaatkan fungsi tab silang() modul tablefunc dalam PostgreSQL:

<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
    ORDER BY user_id, rn
    $$,
    'VALUES (1),(2),(3)'
) AS ct (user_id integer, user_name text, email1 text, email2 text, email3 text);</code>

Penjelasan:

  • Subkueri mendapatkan semula ID pengguna, nama pengguna dan alamat e-mel setiap pengguna, serta nombor ordinal mereka. Fungsi row_number() digunakan untuk menentukan pesanan peti mel untuk setiap pengguna, di mana NULLS LAST memastikan bahawa nilai NULL dianggap sebagai nilai terkini.
  • Fungsi tab silang() kemudian menukar peti mel ke dalam lajur menggunakan nombor baris sebagai kekunci. Parameter kedua "VALUES (1),(2),(3)" tab silang() menentukan tiga lajur yang akan dibuat.
  • Pernyataan SELECT terakhir mengembalikan data yang ditukar, di mana tiga peti mel terbaharu setiap pengguna muncul dalam lajur e-mel1, e-mel2 dan e-mel3.

Nota:

  • Jika setiap pengguna mempunyai bilangan peti mel yang berbeza, anda boleh menggantikan "VALUES (1),(2),(3)" dengan senarai semua nilai kunci yang mungkin.
  • Perhatikan penggunaan NULLS LAST dalam klausa ORDER BY untuk memastikan bahawa nilai NULL dianggap sebagai nilai terkini.

Atas ialah kandungan terperinci Bagaimana untuk Memindahkan Data Baris E-mel Pengguna ke Lajur dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn