web-dev-qa-db-ja.com

jsonb内部フィールドでのPostgres GROUP BY

私はPostgresql 9.4を使用していて、testというテーブルとid::intおよびcontent::jsonb、 次のように:

 id |     content
----+-----------------
  1 | {"a": {"b": 1}}
  2 | {"a": {"b": 1}}
  3 | {"a": {"b": 2}}
  4 | {"a": {"c": 1}}

どうやってGROUP BYcontent列の内部フィールドで、各グループを配列として返しますか?具体的には、私が探している結果は次のとおりです。

             content
---------------------------------
[{"a": {"b": 1}},{"a": {"b": 1}}]
[{"a": {"b": 2}}]
(2 rows)

試してみる:

SELECT json_agg(content) as content FROM test GROUP BY content ->> '{a,b}';

収量:

                               content
----------------------------------------------------------------------
[{"a": {"b": 1}}, {"a": {"b": 1}}, {"a": {"b": 2}}, {"a": {"c": 1}}]
(1 row)
10
JGem

右側のオペランドがjsonパスの場合、#>>ではなく->>演算子を使用する必要があります。これを試して:

SELECT json_agg(content) as content FROM test GROUP BY content #>> '{a,b}';

収量:

              content
------------------------------------
 [{"a": {"c": 1}}]
 [{"a": {"b": 2}}]
 [{"a": {"b": 1}}, {"a": {"b": 1}}]
(3 rows)
8
redneb

Json_agg()は、コンテンツ値(jsonデータ全体)を特定のグループの配列に連結するため、ここで使用するのに最適な選択ではないと思います。
次のようなものを使用する方が理にかなっています(そして、より一般的なシナリオを得るために、「count(*)」を追加しました):

SELECT content #>> '{a,b}' as a_b, count(*) as count FROM test GROUP BY content #>> '{a,b}';
1
user698116