2015-07-12 21 views
0

假設我在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」新發傳染病的查詢。 感謝

+0

,我可以做的最完美的是:'選擇json_each(events.doc - >「開齋節」)從events'該產生**記錄**,如**('a',5)**。 –

回答

2

我不能確定你所說的「按照指定的時間」的意思,但我想你想:

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) 
+0

非常感謝@Marth,如果我想要得到結果,每個eid被連續取得(如** <'a',5>,<'b',12>,<'c', 18>和<'x', 25> **),我應該怎麼做? –

+0

@ehsantoghian:編輯我的答案。不過,我不確定你打算如何在這個查詢中使用'time'值,因爲它似乎你想一次採用所有'eid'。 – Marth

+0

感謝@Marth,當我想將輸出事件(** eid **)限制在一段時間內時使用該時間。例如,我想在上午9點到下午5點之間看到事件。 –

1

綜上所述陣列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