crosstab()
を使用する tablefuncモジュールから。
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);
最初のパラメーターにはドル引用符を使用しましたが、これには特別な意味はありません。クエリ文字列で一重引用符をエスケープすると便利です。これは一般的なケースです:
- PostgreSQLで一重引用符でテキストを挿入
詳細な説明と手順:
- PostgreSQLクロス集計クエリ
特に、「追加の列」の場合:
- Tablefuncを使用して複数の列をピボットする
特別な問題 ここにあります:
-
キー名がありません。
->row_number()
に置き換えます サブクエリで。 -
メールの数はさまざまです。
->最大数に制限されています。外側のSELECT
の3つのうち
そしてcrosstab()
を使用します 2つのパラメータを使用して、可能なキーのリストを提供します。
NULLS LAST
に注意してください ORDER BY
で 。