Dar*_*son 5 sql arrays postgresql aggregate-functions multidimensional-array
我在我们的数据库中有一个名为min_crew具有不同字符数组的列,例如'{CA, FO, FA}'.
我有一个查询,我试图获取这些数组的聚合但没有成功:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
, array_agg(se.min_crew)
FROM base.sched_entry se
LEFT JOIN base.user_sched_entry use ON se.sched_entry_id = use.sched_entry_id
WHERE se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP BY user_sched_id;
Run Code Online (Sandbox Code Playgroud)
623和625都有相同的use.user_sched_id,所以结果应该是seid的分组和min_crew,但我只是不断收到这个错误:
Run Code Online (Sandbox Code Playgroud)ERROR: could not find array type for data type character varying[]
如果我删除了array_agg(se.min_crew)代码的一部分,我会得到一个带有user_sched_id = 2131和的表返回seids = '{623, 625}'.
标准聚合函数array_agg()仅适用于基类型,而不适用于作为输入的数组类型.(但Postgres 9.5+有一个新的变种array_agg()可以!)
您可以使用array_agg_mult()此相关答案中定义的自定义聚合函数:将
数据选择为Postgres数组
每个数据库创建一次.然后您的查询可以像这样工作:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,array_agg_mult(ARRAY[se.min_crew]) AS min_crew_arr
FROM base.sched_entry se
LEFT JOIN base.user_sched_entry use USING (sched_entry_id)
WHERE se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP BY user_sched_id;
Run Code Online (Sandbox Code Playgroud)
链接答案中有详细的理由.
在回复您的评论时,请考虑数组类型手册中的引用:
多维数组必须具有每个维度的匹配范围.不匹配会导致错误.
没有办法,数组类型不允许Postgres中的这种不匹配.您可以使用NULL值填充数组,以便所有维度都具有匹配的范围.
但我宁愿将数组转换为以逗号分隔的列表,array_to_string()以便进行此查询并使用string_agg()聚合text- 最好使用不同的分隔符.在我的示例中使用换行符:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
,string_agg(array_to_string(se.min_crew, ','), E'\n') AS min_crews
FROM ...
Run Code Online (Sandbox Code Playgroud)
您可能需要考虑开始规范化架构.通常,您将使用此示例中概述的单独表实现此类n:m关系:
如何在PostgreSQL中实现多对多关系?
| 归档时间: |
|
| 查看次数: |
7021 次 |
| 最近记录: |