最新のレコードを表示するには、ユーザーの電子メール アドレスを列に置き換えます
各ユーザーの複数の電子メール アドレスをリストしたテーブルがあるとします。目標は、これらの電子メールを、作成日に基づいて「最新」の 3 つのアドレスを表示する列に置き換えることです。これにより、次のような出力テーブルが生成されます:
user_name | user_id | email1 | email2 | email3 |
---|---|---|---|---|
Mary | 123 | [email protected] | [email protected] | [email protected] |
Joe | 345 | [email protected] | (NULL) | (NULL) |
この転置を実現するには、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 $$, $$SELECT generate_series(1,3)$$ ) AS ct (user_id int, user_name text, email1 text, email2 text, email3 text);</code>
外部 SELECT
ステートメントはユーザー固有のデータを抽出し、row_number()
関数に基づいて結果を最新の 3 つの電子メール アドレスに制限します。 crosstab()
関数はこれらの電子メールを列に転置し、欠損値が NULL として表現されるようにします。
以上がユーザーの電子メール アドレスを最新の 3 つだけを表示する列に転置するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。