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

ユーザーの電子メール履歴の行を PostgreSQL の列に転置するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-10 16:44:45
オリジナル
388 人が閲覧しました

How to Transpose User Email History Rows into Columns in PostgreSQL?

ユーザーのメール履歴の再構築: PostgreSQL の行から列へ

各ユーザーの複数の電子メール アドレスを格納するテーブルを想像してください。 この記事では、この行ベースのデータを列形式に効率的に変換する方法、特に最新の電子メール アドレスを個別の列として配置する方法を説明します。 これは、PostgreSQL の tablefunc モジュールと強力な crosstab() 関数を使用して実現します。

crosstab() ソリューション

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 <= 3
   $$,
   $$VALUES (1),(2),(3)$$
) AS ct (user_id INT, user_name TEXT, email_1 TEXT, email_2 TEXT, email_3 TEXT);</code>
ログイン後にコピー

クエリコンポーネントを理解する

  • crosstab() の最初の引数はサブクエリです。このサブクエリは、ユーザー ID、ユーザー名、行番号 (rn)、および電子メール アドレスを取得します。
  • row_number() OVER (PARTITION BY u.user_id ORDER BY e.creation_date DESC NULLS LAST) は、作成日順 (最新のものから順) に、各ユーザーの各電子メール アドレスに一意のランク (rn) を割り当てます。
  • WHERE 句 (WHERE rn <= 3) は、結果をユーザーあたりの最新の 3 つの電子メール アドレスに制限します。
  • crosstab() の 2 番目の引数 ($$VALUES (1),(2),(3)$$) は、新しい列 (電子メール アドレスのランクを表す) の潜在的な値を指定します。

潜在的な課題への対処

元のテーブルには電子メール アドレスごとに個別のキーがないため、row_number() を使用して代理キーを生成する必要がありました。 さらに、ユーザーごとの電子メールの数が可変であるため、外側の SELECT ステートメントで出力を 3 列に制限し、2 番目の crosstab() パラメーターで可能なキー値の範囲を定義する必要がありました。

このアプローチでは、ユーザーごとの最新の電子メール アドレスが効果的に個別の列に変換され、ユーザーの電子メール履歴がより明確に整理されたビューが表示されます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート