varios registros para insertar funcion datos sql arrays postgresql aggregate-functions

sql - registros - Postgres-agregue dos columnas en un elemento



insertar datos pgadmin 4 (4)

En Postgres 9.5 puede obtener una matriz de matrices de texto:

SELECT user_id, array_agg(array[friend_id::text, confirmed::text]) FROM friend_map WHERE user_id = 1 GROUP BY user_id; user_id | array_agg ---------+-------------------------------- 1 | {{2,true},{3,false},{4,false}} (1 row)

o matriz de matrices de int:

SELECT user_id, array_agg(array[friend_id, confirmed::int]) FROM friend_map WHERE user_id = 1 GROUP BY user_id; user_id | array_agg ---------+--------------------- 1 | {{2,1},{3,0},{4,0}} (1 row)

Me gustaría agregar dos columnas en una "matriz" al agrupar.

Supongamos una tabla así:

friends_map: ================================= user_id friend_id confirmed ================================= 1 2 true 1 3 false 2 1 true 2 3 true 1 4 false

Me gustaría seleccionar de esta tabla y grupo por user_id y obtener friend_id y confirmar como un valor concatenado separado por una coma.

Actualmente tengo esto:

SELECT user_id, array_agg(friend_id) as friends, array_agg(confirmed) as confirmed FROM friend_map WHERE user_id = 1 GROUP BY user_id

lo que me pone:

================================= user_id friends confirmed ================================= 1 [2,3,4] [t, f, f]

Como puedo conseguir:

================================= user_id friends ================================= 1 [ [2,t], [3,f], [4,f] ]


Podría evitar la fealdad de la matriz multidimensional y utilizar algunos json que admiten tipos de datos mixtos:

SELECT user_id, json_agg(json_build_array(friend_id, confirmed)) AS friends FROM friends_map WHERE user_id = 1 GROUP BY user_id

O use algunos pares key : value ya que json lo permite, por lo que su salida será más semántica si lo desea:

SELECT user_id, json_agg(json_build_object( ''friend_id'', friend_id, ''confirmed'', confirmed )) AS friends FROM friends_map WHERE user_id = 1 GROUP BY user_id;


Puede concatenar los valores juntos antes de introducirlos en la función array_agg() :

SELECT user_id, array_agg(''['' || friend_id || '','' || confirmed || '']'') as friends FROM friends_map WHERE user_id = 1 GROUP BY user_id

Demostración: SQL Fiddle


SELECT user_id, array_agg((friend_id, confirmed)) as friends FROM friend_map WHERE user_id = 1 GROUP BY user_id user_id | array_agg --------+-------------------------------- 1 | {"(2,true)","(3,false)","(4,false)"}