以下のようなテーブルにJSONフィールドがあります
{
"Ui": [
{
"element": "TG1",
"mention": "in",
"time": 123
},
{
"element": "TG1",
"mention": "out",
"time": 125
},
{ "element": "TG2",
"mention": "in",
"time": 251
},
{
"element": "TG2",
"mention": "out",
"time": 259
}
]
}
私の意図は以下のようなものを手に入れることです
| element | Timespent |
| TG1 | 2 |
| TG2 | 8 |
しかし、完全に失敗しました。違いをどのように取得しますか(言及が入っているときのすべての時間の合計-言及がないときのすべての時間の合計)?現在、私はsum(jsonb_extract_path(data::jsonb, 'ui','hovers')->0->'when')
合計を取得しようとしていますが、jsonファイルを再帰的に調べて言及のためにフィルタリングする方法を理解できません。
json_array_elements()
json配列から列を抽出するために使用します。
select value->>'element' as element, value->>'time' as time_spent
from my_table
cross join json_array_elements(json_column->'Ui')
element | time_spent
-----+------------
TG1 | 123
TG1 | 125
TG2 | 251
TG2 | 259
(4 rows)
上記のクエリを変更して、要素ごとにグループの合計を取得します。
select element, sum(time) as time_spent
from my_table
cross join lateral (
select
value->>'element' as element,
case value->>'mention' when 'in' then -(value->>'time')::numeric else (value->>'time')::numeric end as time
from json_array_elements(json_column->'Ui')) as elements
group by 1
order by 1
element | time_spent
---------+------------
TG1 | 2
TG2 | 8
(2 rows)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加