Postgres массив json, получить все уникальные значения указанного ключа c - PullRequest
0 голосов
/ 31 января 2020

У меня есть таблица с такими данными:

id, array_json
123, [{"Name": "John", "Age": "12"}, {"Name": "Jane", "Age": "18"}, {"Name": "Jake", "Age": "34"}]
124, [{"Name": "Dolly", "Age": "12"}, {"Name": "Molly", "Age": "18"}, {"Name": "Rosa", "Age": "34"}]
123, []
125, [{"Name": "Dolly", "Age": "12"}, {"Name": "Dolly", "Age": "18"}, {"Name": "Holt", "Age": "34"}]

По сути, это идентификатор, сопоставленный с массивом jsons, который является jsonb. Я хочу, чтобы на выходе были все уникальные имена (ключ «Имя») и их счет следующим образом:

id, Unique_Names, Count
123, ["John", "Jane", "Jake"], 3
124, ["Dolly", "Molly", "Rosa"], 3
125, [], 0
126, ["Dolly", "Holt"], 2

Как мне сделать это в postgres?

1 Ответ

3 голосов
/ 31 января 2020

Вам нужно отложить и затем собрать обратно:

select t2.id
       t2.names as unique_names, 
       jsonb_array_length(names) as count 
from (
  select t.id, 
         (select jsonb_agg(distinct e.val ->> 'Name' order by e.val ->> 'Name') 
          from jsonb_array_elements(t.array_json) as e(val)) as names
  from the_table t
) AS t2
order by t2.id;

Онлайн пример

...