2017-12-04 16 views
-1

私はpostgresqlで左結合を使用して2つ以上のテーブルからのインクルード結果を取得しようとしていますが、テーブルentidad_a_(メインテーブル)のレコードごとに1つのレコードが必要です)、テーブルentidad_b_のすべてのレコードをarray_aggによって生成された1つのフィールドに含める必要があります。そして、この配列では、重複する要素を削除しなければならず、メインテーブルの配列配列を保持しなければなりません。 はどのように私は、これらの結果を持つことができます....Postgresql:array_agg DISTINCTとORDER

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 

しかし、私はエラーを持っている: 私はこのSQLクエリを実行する必要がありますか? ありがとうございます!

編集: 私のエラーは次のとおりです。 ERROR:関数ARRAY_AGG(整数、BIGINT)は SQL状態は存在しません:42883 ヒント:機能なしが指定された名前と引数の型と一致しません。明示的な型キャストを追加する必要があるかもしれません。 文字:69

クエリがある場合: ...... ARRAY_AGG(規則性により、DISTINCT entidadB._id順)..... ERORは次のとおりです。 ERROR:集計にDISTINCT、ORDERと42P10 文字:BY式引数リスト SQL状態で表示されなければならない110

私の問題が解決

+0

、エラーは何ですか? **あなたの質問を**編集して**あなたが受け取ったエラーメッセージを追加してください。**コメントは投稿コードや追加情報ではありません。 –

+0

エラーメッセージについて理解していないのですか?あなたは何を(特定の名前なしで)グーグルで見つけて、あなたのタイトルをグーグルで見つけましたか?なぜ仕事をしなかったのですか?なぜあなたは議論と一緒に別の&順序を使用していないのですか? – philipxy

+0

別名と注文を一緒に使用する例と説明がありますか?私はarray_aggと組み合わせてエラーを検出しています。今私はカスタム集計関数を作成しようとしています。 –

答えて

0

によるDISTINCTとORDER、ARRAY_AGGの組み合わせです!!私はカスタムアグリゲーションを使ってpostgres拡張を作成しました。

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

このカスタム関数の関数とcコードを作成します。