Verwenden Sie crosstab()
aus dem tablefunc-Modul.
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);
Für den ersten Parameter, der keine besondere Bedeutung hat, habe ich Dollarnotierungen verwendet. Es ist einfach praktisch, einfache Anführungszeichen in der Abfragezeichenfolge zu maskieren, was ein häufiger Fall ist:
- Text mit einfachen Anführungszeichen in PostgreSQL einfügen
Ausführliche Erklärung und Anleitung:
- PostgreSQL-Kreuztabellenabfrage
Und insbesondere für "zusätzliche Spalten":
- Pivotieren Sie mehrere Spalten mit Tablefunc
Die besonderen Schwierigkeiten hier sind:
-
Das Fehlen von Schlüsselnamen.
--> Wir ersetzen durchrow_number()
in einer Unterabfrage. -
Die unterschiedliche Anzahl von E-Mails.
--> Wir beschränken uns auf max. von drei im äußerenSELECT
und verwenden Siecrosstab()
mit zwei Parametern, die eine Liste möglicher Schlüssel bereitstellen.
Achten Sie auf NULLS LAST
im Feld ORDER BY
.