2016-12-16 24 views
0

我已經寫了一個PSQL語句,它返回JSON中的多個表值的數據,輸出幾乎是正確的,但是我需要更深入一層,我不知道該怎麼做。來自postgresql的嵌套array_to_json輸出

聲明如下:

select array_to_json(array_agg(t)) 
from (
     select sensors.name, 
     (
     select array_to_json(array_agg(row_to_json(d))) 
     from (
     select * 
     from events 
     where sensors.sensorid=events.sensorid 
    ) d 
    ) as signatures 
    from sensors 
) t 

,它輸出以下內容:

[ 
    { 
     "name":"Boston", 
     "signatures":[ 
     { 
      "eventid":1, 
      "sensorid":1, 
      "signature":223123, 
      "srcip":"10.0.0.1", 
      "dstip":"10.0.0.2", 
      "srcport":10000, 
      "dstport":80, 
      "timestamp":"2016-12-10T07:00:00", 
      "gid":null 
     }, 
     { 
      "eventid":2, 
      "sensorid":1, 
      "signature":142142, 
      "srcip":"10.0.0.1", 
      "dstip":"10.0.0.2", 
      "srcport":10000, 
      "dstport":80, 
      "timestamp":"2016-12-10T07:00:00", 
      "gid":null 
     } 
     ] 
    }, 
    { 
     "name":"Greenwich", 
     "signatures":[ 
     { 
      "eventid":12, 
      "sensorid":2, 
      "signature":123123, 
      "srcip":"10.0.0.1", 
      "dstip":"10.0.0.2", 
      "srcport":10000, 
      "dstport":80, 
      "timestamp":"2016-12-10T07:00:00", 
      "gid":null 
     }, 
     { 
      "eventid":13, 
      "sensorid":2, 
      "signature":524123, 
      "srcip":"10.0.0.1", 
      "dstip":"10.0.0.2", 
      "srcport":10000, 
      "dstport":80, 
      "timestamp":"2016-12-10T07:00:00", 
      "gid":null 
     } 
     ] 
    } 
] 

這是一個良好的開端,但我也想是進一步層輸出,使個人簽名成爲陣列中的所有發射,所以輸出應該是這樣的:

{ 
     "name":"Boston", 
     "signatures":[ 
     { 
      "signature": 223123, 
      "firings":[ 
       { 
        "eventid":1, 
        "sensorid":1, 
        "signature":223123, 
        "srcip":"10.0.0.1", 
        "dstip":"10.0.0.2", 
        "srcport":10000, 
        "dstport":80, 
        "timestamp":"2016-12-10T07:00:00", 
        "gid":null 
       } 
      ] 
     }, 
     { 
      "signature": 142142, 
      "firings":[ 
       { 
        "eventid":1, 
        "sensorid":1, 
        "signature":142142, 
        "srcip":"10.0.0.1", 
        "dstip":"10.0.0.2", 
        "srcport":10000, 
        "dstport":80, 
        "timestamp":"2016-12-10T07:00:00", 
        "gid":null 
       } 
      ] 
     } 
     ] 
    }, 

我試圖做這樣的:

select array_to_json(array_agg(t)) 
from (
     select sensors.name, 
     (
     select array_to_json(array_agg(row_to_json(d))) 
     from (
     select distinct events.signature as signatureid, 
     (
     select array_to_json(array_agg(row_to_json(e))) 
     from (
      select * 
      from events 
      where events.signature = signatureid 
     ) e 
     ) as firings 
     from events 
     where sensors.sensorid=events.sensorid 
    ) d 
    ) as signatures 
    from sensors 
) t 

但Postgres的似乎並不喜歡這樣說:「也許你的意思是引用列‘events.signature’或列‘events.signature’ 「。

任何幫助將不勝感激,謝謝!

回答

0
select json_agg(sensor) 
from (
    select 
     json_build_object('name', name, 'signatures', json_agg(signature)) sensor 
    from sensors 
    join (
     select 
      sensorid, 
      json_build_object('signature', signature, 'firings:', json_agg(event)) signature 
     from events e, 
     lateral row_to_json(e) event 
     group by sensorid, signature 
     ) s using(sensorid) 
    group by sensorid 
    ) s; 
+0

嘿,這是尋找偉大的,它完全不是那麼回事,雖然當你添加更多的數據,這不是把每個事件入陣,它的每一次建立一個新的對象:http://rextester.com/ NCZ7287 – Steve

+0

這是一個內部分組標準的問題。請參閱修改後的答案和[本示例](http://rextester.com/INABH8185)。 – klin

+0

你是男人,男人!非常感謝! – Steve