array_agg DISTINCT和ORDER

时间:2017-12-04 10:17:07

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

我试图在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 by ordinality)..... 恐怖是: 错误:在与DISTINCT聚合时,ORDER BY表达式必须出现在参数列表中 SQL状态:42P10 性格:110

我的问题是array_agg,DISTINCT和ORDER by

的组合

1 个答案:

答案 0 :(得分:0)

解决!!我已经使用自定义聚合创建了一个postgres扩展。

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

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