postgresql - 按 JSONB 数组中的唯一值分组

标签 postgresql jsonb

考虑以下表结构:

CREATE TABLE residences (id int, price int, categories jsonb);

INSERT INTO residences VALUES
  (1, 3, '["monkeys", "hamsters", "foxes"]'),
  (2, 5, '["monkeys", "hamsters", "foxes", "foxes"]'),
  (3, 7, '[]'),
  (4, 11, '["turtles"]');

SELECT * FROM residences;

 id | price |                categories
----+-------+-------------------------------------------
  1 |     3 | ["monkeys", "hamsters", "foxes"]
  2 |     5 | ["monkeys", "hamsters", "foxes", "foxes"]
  3 |     7 | []
  4 |    11 | ["turtles"]

现在我想知道每个类别有多少住宅,以及它们的价格总和。我发现的唯一方法是使用子查询:

SELECT category, SUM(price), COUNT(*) AS residences_no
FROM
  residences a,
  (
    SELECT DISTINCT(jsonb_array_elements(categories)) AS category
    FROM residences
  ) b
WHERE a.categories @> category
GROUP BY category
ORDER BY category;

  category  | sum | residences_no
------------+-----+---------------
 "foxes"    |   8 |             2
 "hamsters" |   8 |             2
 "monkeys"  |   8 |             2
 "turtles"  |  11 |             1

使用 jsonb_array_elements由于第二行中的重复条目,没有子查询将返回三个狐狸的住所。住宅的价格也会上涨 5。

有没有什么方法可以不使用子查询,或者有什么更好的方法来实现这个结果?

编辑

最初我没有提到价格栏。

最佳答案

select category, count(distinct (id, category))
from residences, jsonb_array_elements(categories) category
group by category
order by category;

  category  | count 
------------+-------
 "foxes"    |     2
 "hamsters" |     2
 "monkeys"  |     2
 "turtles"  |     1
(4 rows)

您必须使用派生表来聚合另一列(所有价格均为 10):

select category, count(*), sum(price) total
from (
    select distinct id, category, price
    from residences, jsonb_array_elements(categories) category
) s
group by category
order by category;

  category  | count | total 
------------+-------+-------
 "foxes"    |     2 |    20
 "hamsters" |     2 |    20
 "monkeys"  |     2 |    20
 "turtles"  |     1 |    10
(4 rows)    

关于postgresql - 按 JSONB 数组中的唯一值分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38611084/

相关文章:

arrays - 如何在数组索引中创建 Postgresql JSONB 数组?

postgresql - 使用 WHERE 子句从 JSONB 字段中选择

json - PostgreSQL 在 JSON 数组中搜索值

ruby-on-rails - 在 jsonb postgres 中按日期排序

ruby-on-rails - 在 postgres 中存储和检索任意深度嵌套结构的有效方法是什么?

c - 为什么特定函数的 C 名称(链接符号)应在前面加上 'pg_finfo_' ?

结果集错误 : Issue knitting RMarkdown with SQL connection

用于遍历整个无向图并返回找到的所有边的 PostgreSQL SQL 查询

node.js - Sequelize,如何使用 Op.contains 找到具有特定值的模型

postgresql - 在 PostgreSQL 子查询的 WHERE 子句中使用别名