Usar crosstab()
del módulo 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);
Utilicé cotizaciones en dólares para el primer parámetro, que no tiene un significado especial. Es conveniente escapar de las comillas simples en la cadena de consulta, que es un caso común:
- Insertar texto con comillas simples en PostgreSQL
Explicación detallada e instrucciones:
- Consulta de tabulación cruzada de PostgreSQL
Y en particular, para "columnas extra":
- Pivote en múltiples columnas usando Tablefunc
Las dificultades especiales aquí están:
-
La falta de nombres clave.
--> Sustituimos conrow_number()
en una subconsulta. -
El número variable de correos electrónicos.
--> Limitamos a un máximo. de tres en el exteriorSELECT
y usacrosstab()
con dos parámetros, proporcionando una lista de posibles claves.
Preste atención a NULLS LAST
en el ORDER BY
.