【问题标题】:postgres: aggregate many tablespostgres:聚合许多表
【发布时间】:2017-03-03 00:29:32
【问题描述】:

需要select from projects 并得到类似的东西:

[id] = int

[staff] = agg{users.data, staff.data, role.data}

[首席] = agg{users.data、staff.data、role.data}

[client] = agg{users.data, clients.data, role.data}

[涉及] = [agg{users.data, staff.data, role.data}] , [agg{users.data, staff.data, role.data}], ...

[其他项目数据]

我知道array_agg(json_agg),但它只需要 1 个参数。我只得到 [staff] = agg{user.data}

【问题讨论】:

  • 不知道你在说什么。需要样本数据。

标签: sql postgresql aggregate


【解决方案1】:

你需要使用json_build_object/jsonb_build_object(key, value):

 jsonb_agg(
         jsonb_build_object(
                 'usersdata', users.data,
                 'staffdata', staff.data
          ))

UPD:回复评论

使用两个表:

WITH users AS (
     SELECT 1 as id, 'aaa'::text AS data, 10 as cnt
), staff AS (
     SELECT 1 as user_id, 'bbbb'::text AS data, 5 as cnt
) 
SELECT
     jsonb_agg(
         jsonb_build_object(
                 'usersdata', u.data || s.data,
                 'usersdataarray', ARRAY[ u.data, s.data],
                 'cntdata', u.cnt + s.cnt
          ))
FROM users AS u
JOIN staff AS s ON (s.user_id = u.id)

WITH 子句模拟您的表。

【讨论】:

  • 我可以在一个键(列)中聚合来自 2 个表的数据吗?喜欢:“'usersdata', users.data + staff.data”
  • 再次回答。在数据库级别执行此操作是否有效?或者更好地在后端脚本语言中进行不同类型的格式化?哪种方式更快?
  • 分贝。 Db 的存在是为了以简单快捷的方式操作数据 :-) 如果您对一条记录进行一些转换,它可能与 db 和外部语言的时间相同。但是,如果您对多行执行某些操作 - db 在大多数情况下会更好。
猜你喜欢
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 2014-10-25
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多