簡體   English   中英

如何使用其他列類型聚合Postgres中的Jsonb列

[英]How can I aggregate Jsonb columns in postgres using another column type

我在postgres表中有以下數據,

在此處輸入圖片說明

其中data是jsonb列。 我想得到的結果

[
 {field_type: "Design", briefings_count: 1, meetings_count: 13}, 
 {field_type: "Engineering", briefings_count: 1, meetings_count: 13}, 
 {field_type: "Data Science", briefings_count: 0, meetings_count: 3}
]

說明

使用jsonb_each_text函數從名為data jsonb列中提取data 然后,使用GROUP BY為每個不同的field_type獲取一行,以聚合行。 對於每種匯總,我們還需要包括會議和簡報計數,這可以通過用case語句選擇最大值來完成,以便您可以為不同的計數創建兩個單獨的列。 最重要的是,如果缺少某些信息,則應用coalesce函數返回0而不是NULL在您的示例中,這將是Data Science的簡介。

在更高層次的陳述中,現在我們將結果作為具有字段的表存儲起來,我們需要構建一個jsonb對象並將它們全部聚集到一行。 為此,我們使用了jsonb_build_object ,將包含以下內容的對傳遞給它們:字段名稱+值。 這給我們帶來了3行數據,每行數據都有一個單獨的jsonb列。 由於我們只需要在輸出中顯示一行(匯總的json),因此我們需要在此之上應用jsonb_agg 這為我們帶來了您想要的結果。

檢查“ 實時演示”以了解其工作原理。

select
  jsonb_agg(
    jsonb_build_object('field_type', field_type,
                     'briefings_count', briefings_count,
                     'meetings_count', meetings_count
                     )
    ) as agg_data
from (
  select
      j.k as field_type
    , coalesce(max(case when t.count_type = 'briefings_count' then j.v::int end),0) as briefings_count
    , coalesce(max(case when t.count_type = 'meetings_count'  then j.v::int end),0) as meetings_count
  from tbl t, 
       jsonb_each_text(data) j(k,v)
  group by j.k
  ) t

您可以聚合這樣的列,然后將數據插入到另一個表中

select array_agg(data)
from the_table

或使用內置的json函數之一創建新的json數組。 例如jsonb_agg(expression)

暫無
暫無

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

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