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)"}