2016-11-17 14 views
0

json集約を使用しているサブクエリの結果を並べ替えるにはどうすればよいですか?Postgresql jsonb_aggサブクエリ並べ替え

私はこのようなスキーマを持っていた場合:

CREATE TABLE plans(id integer NOT NULL, name character varying(255)); 
CREATE TABLE plan_items (id integer NOT NULL, plan_id integer NOT NULL, expected_at date, status integer); 

を私はplan_itemsを集約していますが、サブクエリによって、JSONの列になります。このよう :

SELECT 
    plans.id, 
    plans.name, 
    jsonb_agg((SELECT pi_cols FROM 
     (SELECT plan_items.id, plan_items.expected_at, plan_items.status) pi_cols 
    )) AS plan_items_data 
FROM 
    plans 
    INNER JOIN plan_items ON plan_items.plan_id = plans.id 
GROUP BY 
    plans.id, 
    plans.name 
ORDER BY plans.id; 

JSONの集計は期待通りに働いて、私に私が必要とする結果が得られています。 OK。 しかし、私は結果を注文することはできません。また

jsonb_agg((SELECT pi_cols FROM 
     (SELECT plan_items.id, plan_items.expected_at, plan_items.status ORDER BY plan_items.expected_at) pi_cols 
    )) AS plan_items_data 

とを::

は、私が試した

jsonb_agg((SELECT pi_cols FROM 
     (SELECT plan_items.id, plan_items.expected_at, plan_items.status) pi_cols ORDER BY pi_cols.expected_at 
    )) AS plan_items_data 

しかし、これらのどれも解決しません。

アイデア?

+1

:: 'jsonb_agg(plan_items.expected_atによって...順)' – Abelisto

答えて

1

望ましいソート順序でテーブルを結合し、横jsonb_agg()の列を選択するために、結合を使用:

select s.plan_id id, name, jsonb_agg(pi_col) 
from (
    select p.id plan_id, p.name, pi.id, expected_at, status 
    from plans p 
    join plan_items pi 
    on p.id = pi.plan_id 
    order by p.id, expected_at 
    ) s, 
lateral (
    select plan_id id, expected_at, status 
    ) pi_col 
group by 1, 2 
order by 1; 

上記のクエリは、(速いほとんどの場合、ビット)より自然かつ柔軟であるように思わよりも、 1つは選択リストにサブクエリがあります。集計の拡張形式使用してみてください

select s.plan_id id, name, json_agg(pi_col order by pi_col.expected_at) 
from (
    select p.id plan_id, p.name, pi.id, expected_at, status 
    from plans p 
    join plan_items pi 
    on p.id = pi.plan_id 
    ) s, 
lateral (
    select plan_id id, expected_at, status 
    ) pi_col 
group by 1, 2 
order by 1; 
+0

おかげクリンを、私はないと思いますが、パフォーマンスを向上させるために、あなたはまた、Abelistoの提案を適用する必要がありますこの問合せには側面が必要です... Abelistoのコメントで十分です。 – AndreDurao

+0

ここでは、横結合は特別な機能ではありません。これは、このようなクエリを作成するのが望ましい方法です。もちろん、 'order by'節を持つ集合体は良い解決策です。 – klin

関連する問題