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
Lepaskan: 2025-01-10 16:02:41
asal
521 orang telah melayarinya

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:

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);
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan