Použijte crosstab()
z modulu 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);
Pro první parametr jsem použil dolarové kotace, které nemají žádný zvláštní význam. Je vhodné v řetězci dotazu uvozovat jednoduché uvozovky, což je běžný případ:
- Vložit text s jednoduchými uvozovkami v PostgreSQL
Podrobné vysvětlení a pokyny:
- PostgreSQL Crosstab Query
A zejména pro „sloupky navíc“:
- Otočte se do více sloupců pomocí Tablefunc
Zvláštní potíže zde jsou:
-
Chybějící názvy klíčů.
--> Dosazujeme pomocírow_number()
v dílčím dotazu. -
Různý počet e-mailů.
--> Omezujeme na max. ze tří ve vnějšímSELECT
a použijtecrosstab()
se dvěma parametry, které poskytují seznam možných klíčů.
Věnujte pozornost NULLS LAST
v ORDER BY
.