首頁 >資料庫 >mysql教程 >如何將使用者電子郵件的行資料轉置為 PostgreSQL 中的欄位?

如何將使用者電子郵件的行資料轉置為 PostgreSQL 中的欄位?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-10 16:02:41449瀏覽

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

將行資料轉為欄位:顯示使用者最新信箱

問題:

您的表格中每個使用者有多個郵箱地址,您希望將其展平為列,以便基於建立日期顯示每個使用者的最新三個郵箱地址。

預期輸出:

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

解:

為此,您可以利用 PostgreSQL 中 tablefunc 模組的 crosstab() 函數:

<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>

解釋:

  • 子查詢檢索每個使用者的使用者 ID、使用者名稱和郵件地址,以及它們的序號。 row_number() 函數用於確定每個使用者的郵箱順序,其中 NULLS LAST 確保 NULL 值被視為最新值。
  • 然後,crosstab() 函數使用行號作為鍵將郵件匣轉置為列。 crosstab() 的第二個參數「VALUES (1),(2),(3)」指定要建立的三個欄位。
  • 最終的 SELECT 語句傳回轉置後的數據,其中每個使用者的最新三個郵箱顯示在 email1、email2 和 email3 欄位中。

注意:

  • 如果每個使用者的郵箱數量不同,您可以用所有可能的鍵值清單取代「VALUES (1),(2),(3)」。
  • 注意在 ORDER BY 子句中使用 NULLS LAST,以確保 NULL 值被視為最新值。

以上是如何將使用者電子郵件的行資料轉置為 PostgreSQL 中的欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn