Postgres在JSON列之間聚合

我有一個Postgres DB,里面有模板和響應的表,每個模板定義了它有多少行和項目,響應將項目放在行中。我希望能夠查詢任何模板的所有響應的“平均”位置的合并響應。

template_post

response_post

在這種情況下,查詢應該返回以下合并的響應:

{
  "filled_rows": [
    {
      "row_id": 0,
      "item_ids": [1]
    },
    {
      "row_id": 2,
      "item_ids": [2]
    },
    {
      "row_id": 4,
      "item_ids": [0,3]
    }
  ]
}

在出現(xiàn)歧義的情況下,當一個項目在多行中出現(xiàn)相同次數(shù)時,應將其放在這些行中的第一行。

? 最佳回答:

這里需要一些聚合級別。

  • 首先,在相關的子查詢中,將filled_rowsitem_ids分解為單獨的行。
  • item_id聚合,取最小值row_id
  • 通過row_id進行聚合,并獲取item_ids的JSON數(shù)組。
  • 將整件事聚合起來,在一個JSON中獲得所有行
SELECT
  tp.id,
  r.result
FROM template_post tp
CROSS JOIN LATERAL (
    SELECT
      jsonb_build_object(
        'filled_rows', jsonb_agg(byRow.*)
      ) AS result
    FROM (
        SELECT
          byItem.row_id,
          jsonb_agg(byItem.item_id) AS item_ids
        FROM (
            SELECT
              MIN((r.value ->> 'row_id') ::int) AS row_id,
              i.value::int AS item_id
            FROM response_post rp
            CROSS JOIN jsonb_array_elements(rp.data -> 'filled_rows') r
            CROSS JOIN jsonb_array_elements_text(r.value -> 'item_ids') i
            WHERE rp.template_id = tp.id
            GROUP BY
              i.value::int
        ) byItem
        GROUP BY
          byItem.row_id
    ) byRow
) r;

db<>fiddle

主站蜘蛛池模板: 麻豆视频一区二区三区| 亚洲国产一区二区视频网站| 国产99视频精品一区| 亚洲日韩中文字幕一区| 亚洲国产一区在线| av在线亚洲欧洲日产一区二区| 久久国产精品最新一区| 中文字幕无线码一区| 国产午夜毛片一区二区三区| 午夜视频一区二区三区| 国产视频一区二区在线观看| 亚洲国产成人久久一区二区三区 | 亚洲AV无码一区二区三区久久精品| 国产成人av一区二区三区在线| 色精品一区二区三区| 波多野结衣一区二区三区88| 国产一区二区精品久久凹凸| 亚洲一区二区三区影院| 日韩内射美女人妻一区二区三区 | 久99精品视频在线观看婷亚洲片国产一区一级在线 | 天天综合色一区二区三区| 精品一区二区三区在线观看l | 国产成人精品一区在线| 夜色阁亚洲一区二区三区| 国产精品一区二区久久精品无码 | 亚洲综合一区二区精品导航| 国语精品一区二区三区| 久久久av波多野一区二区| 日韩aⅴ人妻无码一区二区| 国产精品一区二区久久沈樵| 免费一区二区视频| 亚洲AV无码一区二区乱子伦| 亚洲熟女综合一区二区三区| 一区二区三区视频免费观看 | 日本精品一区二区三区视频| 国产伦一区二区三区高清| 日韩色视频一区二区三区亚洲| 日韩免费无码一区二区三区| 在线精品国产一区二区三区| 精品人妻无码一区二区三区蜜桃一| 国产在线精品一区二区高清不卡 |