[英]Postgres query nested JSONB
我有一個包含objects
list
的JSONB
列。>
這是表架構:
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_id
從position: 1
到position: 2
的轉換計數
在這里,輸出將為2
,因為tracker_id
4
和5
將它們的position
從1
更改為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.