ホームページ >データベース >mysql チュートリアル >最新 3 件のユーザー電子メールを PostgreSQL の列に転置するにはどうすればよいですか?

最新 3 件のユーザー電子メールを PostgreSQL の列に転置するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-10 16:48:42999ブラウズ

How to Transpose the Three Most Recent User Emails into Columns in PostgreSQL?

crosstab() を使用して PostgreSQL で最近のユーザーのメールをピボットする

課題: 複数のユーザーの電子メールが含まれるテーブルを、各ユーザーの最新の 3 つの電子メールが個別の列として表示される形式に変換する必要があります。

ソリューション: PostgreSQL の crosstab() 関数 (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 < 4
     ORDER  BY user_id
   $$
  , 'VALUES (1),(2),(3)'
   ) AS t (user_id int, user_name text, email1 text, email2 text, email3 text);</code>

内訳:

  1. サブクエリ: サブクエリは、creation_date を使用して、ROW_NUMBER() に基づいて各ユーザーのメールをランク付けします。 NULLS LAST は、NULL の作成日が適切に処理されることを保証します。

  2. フィルタリング: WHERE rn < 4 句は、結果をユーザーあたりの最新の 3 件の電子メールに制限します。

  3. crosstab() 関数: crosstab() 関数は、ランク付けされた電子メール データをピボットします。 VALUES (1),(2),(3) パラメーターは 3 つの出力列 (email1email2email3) を定義します。

  4. 出力: 最後のクエリは、user_iduser_name、および最新の 3 つの電子メール アドレスを個別の列として含むテーブルを返します。

このメソッドは転置を効率的に処理し、最新の電子メール データを抽出するための明確かつ簡潔なソリューションを提供します。 tablefunc 拡張機能が PostgreSQL データベースでまだ有効になっていない場合は、忘れずに有効にしてください。

以上が最新 3 件のユーザー電子メールを PostgreSQL の列に転置するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。