Użyj crosstab()
z modułu 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);
Użyłem cudzysłowu w dolarach dla pierwszego parametru, który nie ma specjalnego znaczenia. Po prostu wygodnie jest zmienić pojedyncze cudzysłowy w ciągu zapytania, co jest częstym przypadkiem:
- Wstaw tekst z pojedynczymi cudzysłowami w PostgreSQL
Szczegółowe wyjaśnienie i instrukcje:
- Kwerendy PostgreSQL Crosstab
A w szczególności w przypadku „dodatkowych kolumn”:
- Przestaw na wiele kolumn za pomocą funkcji Tablefunc
specjalne trudności oto:
-
Brak nazw kluczy.
--> Zastępujemyrow_number()
w podzapytaniu. -
Różna liczba e-maili.
--> Ograniczamy się do max. z trzech w zewnętrznymSELECT
i użyjcrosstab()
z dwoma parametrami, dostarczając listę możliwych kluczy.
Zwróć uwagę na NULLS LAST
w ORDER BY
.