簡體   English   中英

Postgres 查詢嵌套 JSONB

[英]Postgres query nested JSONB

我有一個包含objects listJSONB列。>
這是表架構:

column Name | Datatype
---------------------
timestamp   | timestamp
  data      | JSONB 

樣本數據

1.

timestamp : 2020-02-02 19:01:21.571429+00
data : [
  {
    "tracker_id": "5",
    "position": 1
  },
  {
    "tracker_id": "11",
    "position": 2
  },
  {
    "tracker_id": "4",
    "position": 1
  }
]

2.

timestamp : 2020-02-02 19:01:23.571429+00
data : [
  {
    "tracker_id": "7",
    "position": 3
  },
  {
    "tracker_id": "4",
    "position": 2
  }
]

3.

timestamp : 2020-02-02 19:02:23.571429+00
data : [
  {
    "tracker_id": "5",
    "position": 2
  },
  {
    "tracker_id": "4",
    "position": 1
  }
]

我需要找到tracker_idposition: 1position: 2的轉換計數
在這里,輸出將為2 ,因為tracker_id 45將它們的position1更改為2

筆記
轉換應根據timestamp按升序排列
position變化不需要在連續記錄中。
我正在使用 timescaledb 擴展

到目前為止,我已經嘗試查詢單個記錄列表中的對象,但我不確定如何合並每個記錄的列表對象並查詢它們。

對此的查詢是什么? 我應該寫下存儲過程嗎?

有多種函數可以幫助將多個數據庫行組合成單個 JSON 結構:row_to_json()、array_to_json() 和 array_agg()。

然后,您將使用帶有 ORDER BY 子句的常用 SELECT 來獲取所需的時間戳/JSON 數據,並使用上述函數創建單個 JSON 結構。

我不使用 timescaledb 擴展,所以我會選擇基於取消嵌套 json 的純 SQL 解決方案:

with t (timestamp,data) as (values
  (timestamp '2020-02-02 19:01:21.571429+00', '[
  {
    "tracker_id": "5",
    "position": 1
  },
  {
    "tracker_id": "11",
    "position": 2
  },
  {
    "tracker_id": "4",
    "position": 1
  }
]'::jsonb),
  (timestamp '2020-02-02 19:01:23.571429+00', '[
  {
    "tracker_id": "7",
    "position": 3
  },
  {
    "tracker_id": "4",
    "position": 2
  }
]
'::jsonb),
  (timestamp '2020-02-02 19:02:23.571429+00', '[
  {
    "tracker_id": "5",
    "position": 2
  },
  {
    "tracker_id": "4",
    "position": 1
  }
]
'::jsonb)
), unnested as (
  select t.timestamp, r.tracker_id, r.position
  from t
  cross join lateral jsonb_to_recordset(t.data) AS r(tracker_id text, position int)
)
select count(*)
from unnested u1
join unnested u2
  on u1.tracker_id = u2.tracker_id
 and u1.position = 1 
 and u2.position = 2
 and u1.timestamp < u2.timestamp;

暫無
暫無

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

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