[英]Postgresql create array from table
我有一張這樣的桌子:
serial | channel | sum | date
210062912 1 0.827 2019-01-01
210062912 2 20.864 2019-01-01
210062912 3 0.000 2019-01-01
210062912 1 0.650 2019-01-02
210062912 2 29.666 2019-01-02
是否可以使用 postgres 返回如下內容?
serial_channel | array
210062912-1 [[2019-01-01,0.827],[2019-01-02,0.650]]
210062912-2 [[2019-01-01,20.864],[2019-01-02,29.666]]
210062912-3 [[2019-01-01,0.000]]
問題是你內心的“陣列”。 數組只能組合相同類型的值。 但是您正在嘗試將numeric
類型和date
結合起來。
您可以將它們放入類型行並聚合行:
SELECT
serial || '-' || channel as serialchannel,
array_agg(row(date, sum))
FROM
mytable
GROUP BY 1
結果:
serial_channel | array_agg
:--------------| :----------------------------------------
210062912-1 | [(2019-01-01,0.827),(2019-01-02,0.650)]
210062912-2 | [(2019-01-01,20.864),(2019-01-02,29.666)]
210062912-3 | [(2019-01-01,0.000)]
或者,您可以將兩個值都轉換為text
類型。 然后您就可以生成一個文本數組:
SELECT
serial || '-' || channel as serialchannel,
array_agg(ARRAY[date::text, sum::text])
FROM
mytable
GROUP BY 1
結果:
serial_channel | array_agg
:--------------| :----------------------------------------
210062912-1 | [["2019-01-01","0.827"],["2019-01-02","0.650"]]
210062912-2 | [["2019-01-01","20.864"],["2019-01-02","29.666"]]
210062912-3 | [["2019-01-01","0.000"]]
第三種方法是使用 JSON:
SELECT
serial || '-' || channel as serialchannel,
json_agg(json_build_object('date', mydate, 'sum', mysum))
FROM
mytable
GROUP BY 1
serialchannel | json_agg
:------------ | :---------------------------------------------------------------------------------
210062912-3 | [{"sum" : 0.000, "date" : "2019-01-01"}]
210062912-2 | [{"sum" : 20.864, "date" : "2019-01-01"}, {"sum" : 29.666, "date" : "2019-01-02"}]
210062912-1 | [{"sum" : 0.827, "date" : "2019-01-01"}, {"sum" : 0.650, "date" : "2019-01-02"}]
您可以返回一個 JSONB 數組,其中鍵是日期:
select concat_ws('-', "serial", channel) as serial_channel,
jsonb_agg(jsonb_build_object("date", sum))
from the_table
group by serial_channel;
會返回:
serial_channel | jsonb_agg
---------------+-------------------------------------------------
210062912-3 | [{"2019-01-01": 0.000}]
210062912-2 | [{"2019-01-01": 20.864}, {"2019-01-02": 29.666}]
210062912-1 | [{"2019-01-01": 0.827}, {"2019-01-02": 0.650}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.