假設我在PostgreSQL中有一個包含兩列Id和Doc的表。 在doc列像下面一個JSON對象:在PostgreSQL中總結Json行中的值
{"eid":{"a":5, "b":6, "c":9}, "time":12345}
{"eid":{"b":6, "c":9, "x":25}, "time":13255}
我會感激幫助我按照指定的時間寫一個總結「A」新發傳染病的查詢。 感謝
假設我在PostgreSQL中有一個包含兩列Id和Doc的表。 在doc列像下面一個JSON對象:在PostgreSQL中總結Json行中的值
{"eid":{"a":5, "b":6, "c":9}, "time":12345}
{"eid":{"b":6, "c":9, "x":25}, "time":13255}
我會感激幫助我按照指定的時間寫一個總結「A」新發傳染病的查詢。 感謝
我不能確定你所說的「按照指定的時間」的意思,但我想你想:
SELECT * FROM j;
┌───────────────────────────────────────────────────┐
│ doc │
├───────────────────────────────────────────────────┤
│ {"eid": {"a": 5, "b": 6, "c": 9}, "time": 12345} │
│ {"eid": {"b": 6, "c": 9, "x": 25}, "time": 13255} │
└───────────────────────────────────────────────────┘
(2 rows)
SELECT SUM((doc#>>'{eid,a}')::integer)
FROM j
WHERE (doc->>'time')::integer = 12345;
┌─────┐
│ sum │
├─────┤
│ 5 │
└─────┘
(1 row)
編輯
要獲得所有按鍵在一次(根據您的模式,您可能需要更改jsonb_*
至json_*
):
SELECT key, SUM(jsonb_extract_path_text(doc, 'eid', key)::integer)
FROM j, jsonb_object_keys(doc->'eid') sub(key)
GROUP BY key
;
┌─────┬─────┐
│ key │ sum │
├─────┼─────┤
│ x │ 25 │
│ b │ 12 │
│ a │ 5 │
│ c │ 18 │
└─────┴─────┘
(4 rows)
非常感謝@Marth,如果我想要得到結果,每個eid被連續取得(如** <'a',5>,<'b',12>,<'c', 18>和<'x', 25> **),我應該怎麼做? –
@ehsantoghian:編輯我的答案。不過,我不確定你打算如何在這個查詢中使用'time'值,因爲它似乎你想一次採用所有'eid'。 – Marth
感謝@Marth,當我想將輸出事件(** eid **)限制在一段時間內時使用該時間。例如,我想在上午9點到下午5點之間看到事件。 –
綜上所述陣列eid
的所有值對於給定的time
使用此查詢:
select time, sum(value)
from (
select
(json_each(doc->'eid')).value::text::int,
doc->>'time' as time
from events
) alias
group by 1
order by 1
,我可以做的最完美的是:'選擇json_each(events.doc - >「開齋節」)從events'該產生**記錄**,如**('a',5)**。 –