mysql - PostgreSQL 查询 : distinct count of jsonb values column

标签 mysql sql postgresql postgresql-9.1

我有一个名为 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')

关于mysql - PostgreSQL 查询 : distinct count of jsonb values column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59399568/

相关文章:

php - CASE 语句未运行两个 WHEN

sql - 什么是用于选择项目/属性列表中具有多个属性的项目的 SQL 语句?

sql - CI Server中安装DB Server是否错误

sql - 映射用 Hibernate 返回表的 postgres 函数

multithreading - 移植 PL/pgSQL 存储过程?

java - SQL异常 : No suitable driver found for jdbc:postgresql

MySQL MIN() 函数只返回一条记录

mysql - 为什么可以删除但不能截断?

php - 在 mysql ORDER BY 中使用 case

sql - 如何将结果数限制为每个 'user' 仅 5 个,但如果第 5 行的立即值与连续行相同,则允许更多行?