Tengo un montón de resultados de encuestas dinámicas almacenados en una tabla con una columna JSON que se ve así:
{"regional":"never","local":"sometimes","personal":"often","bike":"field_4","walk":"field_5","carpool":"field_4","carshare":"often","rideshare":"sometimes"}Las claves son valores que existen dinámicamente en todo el conjunto de datos. Necesito encontrar una forma eficiente de agregar las claves y contar los resultados correlacionados. Estos datos representan una pregunta de encuesta de escala Likert, es decir.
"¿Con qué frecuencia va a la estación de autobuses? Pocas veces, a veces, muy a menudo"
El conjunto de datos resultante que me gustaría producir es:
{ "regional": { "sometimes": 20, "often": 10, "never": 5 }, "bike": { "sometimes": 20, "often": 10, "never": 5 } "walk": { "sometimes": 20, "often": 10, "never": 5 } }Intenté JSON_EACH para dividir los valores en pares clave/valor, pero ahora tengo problemas para agregar las claves y la frecuencia de los posibles resultados. Esto es lo que tengo hasta ahora:
SELECT json_data.key, json_data.value FROM "SubmissionData" AS sd, JSON_EACH_TEXT(sd.data) AS json_data WHERE sd.key = 'transit'Sin embargo, definitivamente se topó con un obstáculo aquí.
Gracias.
Use json_object_agg() , por ejemplo:
with my_table(data) as ( values ('{"regional":"never","local":"sometimes","personal":"often"}'::json), ('{"regional":"often","local":"sometimes","personal":"often"}'::json) ) select json_object_agg(key, vals) from ( select key, json_object_agg(value, count) vals from ( select key, value, count(*) from my_table, json_each_text(data) group by 1, 2 ) s group by 1 ) s; json_object_agg ------------------------------------------------------------------------------------------------------------ { "regional" : { "never" : 1, "often" : 1 }, "personal" : { "often" : 2 }, "local" : { "sometimes" : 2 } } (1 row)