繁体   English   中英

创建视图时,postgres聚合联接与多个数组字段匹配

postgres aggregate join matches to multiple array fields while creating views

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有以下架构+数据:

create table org_users (
  id character varying (255),
  settings_id character varying (255) -- fk: settings.id
);

create table settings (
  id character varying (255), -- primary key settings_id
  perdiem_settings character varying (255), -- jsonised fk to perdiems.id
  floor_settings character varying (255) -- jsonised fk to floors.id
);

create table perdiems (
  id integer, -- primary key
  name character varying(255)
);

create table floors (
  id integer, -- primary key
  name character varying (255)
);

insert into perdiems (id, name) values (1, 'perdiem 1');
insert into perdiems (id, name) values (2, 'perdiem 2');
insert into perdiems (id, name) values (3, 'perdiem 3');

insert into floors (id, name) values (1, 'floor 1');
insert into floors (id, name) values (2, 'floor 2');
insert into floors (id, name) values (3, 'floor 3');

insert into settings (id, perdiem_settings, floor_settings) values ('setting1', '{"allowed_per_diem_ids":[1, 2]}', '{"allowed_floor_ids":[1]}');
insert into settings (id, perdiem_settings, floor_settings) values ('setting2', '{"allowed_per_diem_ids":[2, 3]}', '{"allowed_floor_ids":[1, 2]}');
insert into settings (id, perdiem_settings, floor_settings) values ('setting3', '{"allowed_per_diem_ids":[3, 1]}', '{"allowed_floor_ids":[1, 2, 3]}');

insert into org_users (id, settings_id) values ('user1', 'setting1');
insert into org_users (id, settings_id) values ('user2', 'setting2');
insert into org_users (id, settings_id) values ('user3', 'setting3');

现在,我想创建一个视图,该视图将每个其他表的聚合汇总到自己的数组字段中。 为了举例说明,我想要的视图应该像这样:

org_user_id | settings_id | perdiems                   | floors
--------------------------------------------------------------------------------------------
user1       | setting1    | ['perdiem 1', 'perdiem 2'] | ['floor 1']
user2       | setting2    | ['perdiem 2', 'perdiem 3'] | ['floor 1', 'floor 2']
user3       | setting3    | ['perdiem 3', 'perdiem 1'] | ['floor 1', 'floor 2', 'floor 3']

这个问题在某种程度上与postgres聚合联接匹配到一个数组字段有关 ,该字段用于处理联接匹配之外的数组字段 但是,在这里我想在单个视图中创建多个数组字段,因此使用GROUP BY子句将是不可行的。

我尝试过的查询是:

CREATE OR REPLACE VIEW users_settings_view AS
 SELECT ou.id AS org_user_id, <other fields...>
    FROM org_users ou
     LEFT JOIN settings pdr_s ON pdr_s.id = ou.settings_id
     LEFT JOIN perdiems pdr ON pdr.id = ANY (SELECT json_array_elements(perdiem_settings::JSON->'allowed_per_diem_ids')::text::int FROM settings)

由于连接而不是创建数组,因此会为每个匹配的永久对象创建重复记录。 即使我像另一个stackoverflow问题中提到的那样创建了一个数组,但是如果我有多个字符串数组作为不同列的视图的一部分,它也将无法工作。 以任何方式我可以在单个视图中获得多个联接匹配到多个数组字段?

1 个回复

这将为您提供结果。

select ou.id, array_agg( DISTINCT pd.name  ),
              array_agg( DISTINCT f.name   )
from org_users ou join settings s on  ou.settings_id = s.id
 cross join lateral
    json_array_elements_text(((s.perdiem_settings)::json->'allowed_per_diem_ids')::json)
       as jp(perdiem) join
      perdiems pd    
   on pd.id = jp.perdiem::int
  cross join lateral
    json_array_elements_text(((s.floor_settings)::json->'allowed_floor_ids')::json)
        as js(floor) join
      floors f
   on f.id = js.floor::int
   GROUP BY ou.id;

演示

编辑

对于NULL设置,可以单独使用UNION ALL

select id , ARRAY[NULL] as perdiems ,ARRAY[NULL] as floors FROM org_users 
WHERE settings_id IS NULL 
 UNION ALL
(
   -- The above query --
 ) ORDER BY id;

DEMO2

1 postgres聚合联接与数组字段匹配

我有以下架构+数据: 现在,我想要每个org_user允许的永久名称的列表,例如: 如果使用以下查询,则可以获取单个用户的个人名称,但是由于是联接,因此记录是重复的。 输出: 现在,以什么方式获取期望格式的记录? 我希望连接操作的输出成为数组字段的单个元素。 ...

2 postgres:在多个字段上聚合函数

我的桌子是: 我想按类型分组,并为每个分组找到最高价格和最早的(按时间)价格。 从计算的角度来看,这是一个简单的线性/约简运算。 但是如何在postgres中完成呢? 有这样的现有功能吗? 我必须创建自己的聚合吗? 我应该将两个字段编码为一个类似$time-$price字段 ...

3 在Postgres的LEFT JOIN LATERAL中聚集一个布尔数组

问题 如何在LEFT JOIN LATERAL实现布尔数组的聚合? result可以有很多owners 。 只有一个ownership记录是original -这是因为我们支持将original owner的result分配给新owner 。 在这种情况下,我们将拥有两个ownership记 ...

5 BigQuery:将多个字段聚合到数组中

我有一些数据,对于每个ID,我想将两个或多个字段聚合到一个数组中,我希望它们在顺序方面匹配。 例如,如果我有以下数据: 我想把它变成这个: 或者,像这样的东西也可以: 首先,如果我要使用这样的查询,它会做我想要的,还是不能保证两个字段以相同的顺序通过(即 ...

6 连接字段具有多个匹配项时的MYSQL聚合条目

我试图为可能会与给定老师一起参加多个课程的学生计算答案总数,以及对给定问题的正确答案总数。 我希望将结果按测试和老师分组,并删除重复的学生。 我要摆脱的是: 但是,由于student3,student4和student5与Teacher1一起进入不同的班级(见下文),导致他们被计 ...

9 Postgres条件聚集数组

我有一个包含应用程序功能的自引用树结构。 通过其他两个多对多表,我想知道用户可以访问哪些功能。 总结:用户可以有多个作业。 作业包含一组功能,并可以选择拒绝。 这对于在树结构中管理权限很有用,例如: 有以下功能: 只有叶节点( createProduct , dele ...

10 Postgres:将列聚合到数组中

我有以下两个表: 和 我希望每个列表都有一个游戏ID数组,如下所示: 我想出了以下解决方案,但似乎相当复杂,尤其是在使用了distinct on和last_value获得完整数组的last_value : with w as ( select list_id ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM