【问题标题】:array_agg DISTINCT and ORDERarray_agg DISTINCT 和 ORDER
【发布时间】:2018-05-17 18:45:02
【问题描述】:

我正在尝试在 PostgreSQL 中查询包含使用左连接横向的 2 个(或更多)表的结果,并且我需要为表 entidad_a_(主表)的每条记录以及来自表 entidad_b_ 必须包含在 array_agg 生成的一个字段中。在这个数组中,我必须删除重复的元素,并且我必须在主表中保留顺序数组。 我需要执行这个 SQL 查询:

SELECT entidad_a_._id_ AS "_id", CASE WHEN count(entidadB) > 0 THEN array_agg(DISTINCT entidadB._id,ordinality order by ordinality)
ELSE NULL END AS "entidadB"
FROM entidad_a_ as entidad_a_, unnest(entidad_a_.entidad_b_) WITH ORDINALITY AS u(entidadb_id, ordinality)
LEFT JOIN LATERAL (
SELECT entidad_b_3._id_ AS "_id", entidad_b_3.label_ AS "label"
FROM entidad_b_ as entidad_b_3
WHERE entidad_b_3._id_ = entidadb_id
GROUP BY entidad_b_3._id_
LIMIT 1000 OFFSET 0
) entidadB ON TRUE
GROUP BY entidad_a_._id_
LIMIT 1000 OFFSET 0

但是我有错误.... 我怎样才能得到这些结果?

已编辑: 我的错误是: 错误:函数 array_agg (integer, bigint) 不存在 SQL 状态:42883 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。 字符:69

如果查询是: ......array_agg(DISTINCT entidadB._id order by ordinality)...... 错误是: 错误:在具有 DISTINCT 的聚合中,ORDER BY 表达式必须出现在参数列表中 SQL状态:42P10 字符:110

我的问题是array_agg、DISTINCT和ORDER by的组合

【问题讨论】:

  • 错误是什么?请edit您的问题并添加您收到的错误消息 - 在 cmets 中不要邮政编码或其他信息。
  • 您对错误消息有什么不明白的地方?你在谷歌上搜索它们(没有你的具体名字)和搜索你的标题学到了什么?为什么铸造不起作用?为什么不将 distinct & order 与参数一起使用?
  • 你能解释一下并用 distinct 和 order 的例子吗?我将它与 array_agg 结合使用时会出现错误。现在我正在尝试创建一个自定义聚合函数。

标签: postgresql left-join sql-order-by distinct


【解决方案1】:

解决了!!我创建了一个带有自定义聚合的 postgres 扩展。

    CREATE AGGREGATE array_agg_dist (anyelement)
(
    sfunc = array_agg_transfn_dist,
    stype = internal,
    finalfunc = array_agg_finalfn_dist,
    finalfunc_extra
);

为此自定义函数创建函数和 c 代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    相关资源
    最近更新 更多