簡體   English   中英

Postgresql 從表中創建數組

[英]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]]

演示:db<>小提琴

問題是你內心的“陣列”。 數組只能組合相同類型的值。 但是您正在嘗試將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}]  

在線示例: https://rextester.com/FZS1666

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM