Postgresql: Aggregieren von Objekten in einem (json) Array (Unterabfrageprobleme)


8

Der vage Titel tut mir leid, aber ich kenne einfach nicht die richtigen Worte, um dies zu beschreiben.

Ich habe diese Abfrage, die eine Reihe von Spalten in ein Objekt umwandelt, das einwandfrei funktioniert:

SELECT row_to_json(t) FROM ( SELECT type, properties, geometry FROM "bgbCargoMinardJSON" ) t

Ich möchte jedoch die Objekte, die in eine bestimmte Kategorie fallen, in einem Array gruppieren. Diese Kategorie wird durch eine vierte Spalte in meiner Tabelle mit dem Namen "loadProductId" definiert. Das Array sollte den Wert "loadProductId" als Schlüssel haben. Damit:

"961":[ {"type":"Feature",.... {"type":"Feature",.... {"type":"Feature",.... ], "962":[ ..... ]

Ich habe also in den letzten 1 1/2 Stunden damit zu kämpfen. Ich habe wirklich keine Ahnung, wie das geht. Das habe ich gerade:

SELECT array_agg(row_to_json(t)) FROM ( SELECT type, properties, geometry FROM "bgbCargoMinardJSON" ) t) FROM "bgbCargoMinardJSON" GROUP BY "carProductId"

Antworten:


8

Wenn Sie auf 9.4 sind, könnte so etwas das sein, wonach Sie suchen:

select json_object(array_agg(id)::text[],array_agg(rw)::text[])
from( select id
           , ( select to_json(array_agg(row_to_json(t)))
               from (select typ,prop from bgb where id=b.id) t ) rw
      from bgb b
      group by id ) z;

Danke Jack! In Bezug auf die Formation hat es den Trick getan! Das einzige Problem, das ich habe, ist, dass es keinen gültigen JSON liefert (technisch gesehen). Es gibt diesen Text zur JSON-Konvertierung wie: {"3565": "[{\"type\":Ich habe ein Apostroph vor jeder Klammer und einen Schrägstrich vor jedem Apostroph. Ich hatte das schon einmal und es ist immer etwas mit dem Datentyp. Um ehrlich zu sein, ich verstehe nicht ganz, wie die von Ihnen geschriebene Abfrage funktioniert, und daher weiß ich nicht wirklich, wo und wie ich das beheben kann.
Ervazu

Dies ist wahrscheinlich nicht die beste Lösung, aber ich habe nur die Ersetzungsfunktion verwendet, um dies zu beheben. Nochmals vielen Dank für Ihre Zeit!
Ervazu

1
Dies funktionierte für meinen Fall:json_agg(to_json(items.*)) as "items"
Ricka
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.