2017-11-02 4 views
0

私は多くの関係1つを持つテーブルに、ここに問い合わせていますPostgreSQLでグループ化されたすべてのjson行を単一の配列にプッシュする、異なる非一意の列を使用して結果をグループ化する方法はありますか?

SELECT t1.id, t1.deployment_id, (select row_to_json(_) from (select t2.room_id, t2.unit) as _) AS rooms FROM devices_device AS t1 LEFT OUTER JOIN devices_deviceunitroom AS t2 ON t1.id = t2.device_id; 

このクエリの結果は以下の通りです: enter image description here

は、今私が達成したいものです。

  • t2.roomidとt2.unitがnullの場合単純な{}が必要です
  • 結果がグループ化され、最後には1行しか表示されませんidとdeployment_id、部屋は

はのは、似た何かを言わせて1列にすべてをあるべき

d9:7f:d1:ed:ea:72:4a |          | [] 
a9:e7:68:95:88:0b:40 | 6c742391-436c-4fa2-8dc2-6064aad290d0 | [{"room_id":"4f1680ad-43cc-4f16-969e-1a9a00763efd","unit":0}, {"room_id":"16b26a1a-c0dd-4b88-91db-f4809c70396a","unit":1}, {"room_id":"4f1680ad-43cc-4f16-969e-1a9a00763efd","unit":2}] 

Postgresはすべての列がGROUP BY句になりたがっているので、私はGROUP BYで失敗したんだこれ重複を招く。誰かがこれの良い道を私に導くことができますか?

答えて

0

私は誰が今まで同様の問題があります場合は、ここに答えを残して、それを行うための良い方法を見つけるために最後にできた:

私はこれを達成するために生成されたSQLは、次のとおりです。

SELECT 
    t1.id, 
    t1.deployment_id, 
    array_to_json(COALESCE(array_agg(json_build_object('room_id', t2.room_id, 'unit', t2.unit)) FILTER (WHERE t2.room_id IS NOT NULL),ARRAY[]::json[])) AS rooms 

FROM 
    table_1 AS t1 

LEFT OUTER JOIN 
    table_2 AS t2 

ON 
    t1.id = t2.device_id 

WHERE 
    t1.deployment_id = %s::uuid 

GROUP BY 
    t1.id; 
関連する問題