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>
内訳:
サブクエリ: サブクエリは、creation_date
を使用して、ROW_NUMBER()
に基づいて各ユーザーのメールをランク付けします。 NULLS LAST
は、NULL の作成日が適切に処理されることを保証します。
フィルタリング: WHERE rn < 4
句は、結果をユーザーあたりの最新の 3 件の電子メールに制限します。
crosstab()
関数: crosstab()
関数は、ランク付けされた電子メール データをピボットします。 VALUES (1),(2),(3)
パラメーターは 3 つの出力列 (email1
、email2
、email3
) を定義します。
出力: 最後のクエリは、user_id
、user_name
、および最新の 3 つの電子メール アドレスを個別の列として含むテーブルを返します。
このメソッドは転置を効率的に処理し、最新の電子メール データを抽出するための明確かつ簡潔なソリューションを提供します。 tablefunc
拡張機能が PostgreSQL データベースでまだ有効になっていない場合は、忘れずに有効にしてください。
以上が最新 3 件のユーザー電子メールを PostgreSQL の列に転置するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。