[英]Remove duplicates from array_agg, where elements are also arrays
在 Postgres 11 数据库中,我在两个连接到 MAIN 表的视图中有两个 arrays:
vw_ideas_role_direction_mappings.user_direction_id - 数组(如 {101,103,} 或 {101,103} 或 {101,} 或 {101,,,,104}) vw_ideas_role_category_mappings.user_direction_id - 数组如前。
视图 vw_ideas_role_category_mappings 的 DDL:
category_id - int8
user_direction_id - 数组——无限制
视图 vw_ideas_role_direction_mappings 的 DDL:
direction_id - int8
user_direction_id - 数组——无限制
DDL表的想法:
id - bigserial -- 没有限制
以及以下查询,我在其中加入了所有内容:
SELECT i.id,
array_agg(dvircm.user_direction_id || dvirdm.user_direction_id) AS directions_id
FROM idea.ideas i
LEFT JOIN vw_ideas_role_direction_mappings = i.direction_id
LEFT JOIN vw_ideas_role_category_mappings dvircm ON dvircm.category_id = i.category_id
GROUP BY i.id
所以arrays中可以有NULL并且重复。
此查询不会删除它们,而且还会抛出错误 - 无法累积不同维度的 arrays(可能是因为 arrays 中数字前后有逗号','?因为当我创建数组 user_direction_id 时,我使用此查询
array_agg(distinct vw_user_data_all_roles.direction_id))
合并 2 arrays 后如何消除错误并删除重复项和 null?
我认为这会做你想要的:
SELECT i.id, sub.directions_id
FROM idea.ideas i
LEFT JOIN LATERAL (
SELECT ARRAY (
SELECT u.id
FROM vw_ideas_role_direction_mappings d, unnest(d.user_direction_id) u(id)
WHERE d.direction_id = i.direction_id
AND u.id IS NOT NULL
UNION
SELECT u.id
FROM vw_ideas_role_category_mappings c, unnest(c.user_direction_id) u(id)
WHERE c.category_id = i.category_id
AND u.id IS NOT NULL
)
) sub(directions_id) ON sub.directions_id <> '{}'; -- exclude empty array?
取消嵌套后的UNION
删除重复的数组元素。
NULL 个值被删除。
关于 ARRAY 构造函数:
由于 ARRAY 构造函数总是返回一行(就像聚合函数),我们可以使用CROSS JOIN
。 否则,我们将使用LEFT JOIN.. ON true
。 关于LATERAL
连接:
如果您需要保留一些原始顺序,请考虑WITH ORDINALITY
和ORDER BY
... 请参阅:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.