簡體   English   中英

PostgreSQL 查詢:jsonb 值列的不同計數

[英]PostgreSQL query : distinct count of jsonb values column

我有一個名為mainapp_project_data的表,它有一個 jsonb 列project_user_data

  • 桌子
 public | mainapp_project_data | table | admin

select project_user_data from mainapp_project_data;

                                         project_user_data

-----------------------------------------------------------------------------------------------------------------
 [{"name": "john", "age": "21", "gender": "M"}, {"name": "randy", "age": "23", "gender": "M"}]
 [{"name": "donald", "age": "31", "gender": "M"}, {"name": "wick", "age": "32",
"gender": "M"}]
 [{"name": "orton", "age": "18", "gender": "M"}, {"name": "russel", "age": "55",
"gender": "M"}]
 [{"name": "angelina", "age": "open", "gender": "F"}, {"name": "josep", "age": "21",
"gender": "M"}]
(4 rows)

(END)
  • 我想計算 JSON 鍵genderage的不同值。

輸出格式: [{key:count(repeated_values)}]

filtering on `gender` : [{"M":7},{"F":1}]
filtering on `age` : [{"21":2},{"23":1},{"31":1}.....]
WITH flat AS (
  SELECT
    kv.key,
    -- make into a JSON object with a single value and count, e.g., '{"M": 7}'
    jsonb_build_object(kv.value, COUNT(*)) AS val_count
  FROM mainapp_project_data AS mpd
    -- Flatten the JSON arrays into single objects per row
    CROSS JOIN LATERAL jsonb_array_elements(mpd.project_user_data) AS unarrayed(udata)
    -- Convert to a long, flat list of key-value pairs
    CROSS JOIN LATERAL jsonb_each_text(unarrayed.udata) AS kv(key, value)
  GROUP BY kv.key, kv.value
)
SELECT
  -- de-deplicated object keys
  flat.key,
  -- aggregation of all values and counts per key
  jsonb_agg(flat.val_count) AS value_counts
FROM flat
GROUP BY flat.key

退貨

  key   |                                                  value_counts
--------+---------------------------------------------------------------------------------------------------------------------
 gender | [{"M": 7}, {"F": 1}]
 name   | [{"josep": 1}, {"russel": 1}, {"orton": 1}, {"donald": 1}, {"wick": 1}, {"john": 1}, {"randy": 1}, {"angelina": 1}]
 age    | [{"18": 1}, {"32": 1}, {"21": 2}, {"23": 1}, {"open": 1}, {"31": 1}, {"55": 1}]

這將提供任何鍵值對實例計數。 如果您只想要性別和年齡,只需在第一個GROUP BY子句之前添加一個 where 子句。

  WHERE kv.key IN ('gender', 'age')

像這樣的事情對你有用嗎?

postgres=# select count(*), (foo->'gender')::text as g from (select json_array_elements(project_user_data) as foo from mainapp_project_data) as j group by (foo->'gender')::text;                           
 count |  g                                                                                           
-------+-----                                                                                         
     7 | "M"                                                                                          
     1 | "F"                                                                                          
(2 rows)                               

postgres=# select count(*), (foo->'age')::text as g from (select json_array_elements(project_user_data) as foo from mainapp_project_data) as j group by (foo->'age')::text;                                 
 count |   g                                                                                          
-------+--------                                                                                      
     2 | "21"                                                                                         
     1 | "32"                                                                                         
     1 | "open"                                                                                       
     1 | "23"                                                                                         
     1 | "18"                                                                                         
     1 | "55"                                                                                         
     1 | "31"                                                                                         
(7 rows)                                                                                              ```                                                               

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM