是否可以执行类似于json的运行和的操作?
我有这张桌子:
day id data
────────────┼───────┼───────────────────
2016-06-20 │ 1 │ {"key0": "value0"}
2016-06-21 │ 1 │ {"key1": "value1"}
2016-06-22 │ 1 │ {"key2": "value2"}
我想要这张桌子:
day id data
────────────┼───────┼────────────────────────────────────────────────────
2016-06-20 │ 1 │ {"key0": "value0"}
2016-06-21 │ 1 │ {"key0": "value0", "key1": "value1"}
2016-06-22 │ 1 │ {"key0": "value0", "key1": "value1", "key2": "value2"}
我尝试使用窗口函数,因为默认行为与聚合函数类似,但我不知道如何正确地对json执行此操作。
有人能帮忙吗?
最佳答案
没有连接JSONB对象的内置聚合(jsonb_agg()
返回一个数组,而不是一个JSON值),但是很容易创建一个:
create aggregate jsonb_append(jsonb)
(
sfunc = jsonb_concat(jsonb, jsonb),
stype = jsonb
);
此聚合还可以用作执行“运行聚合”的window function,因此您可以执行以下操作:
select day, id, jsonb_append(data) over (order by day)
from topo
order by day;
请注意,JSONB不保留键的顺序。因此,聚合的jsonb值中键的顺序可能与检索顺序不完全相同。
如果相同的键存在于多行中,则将保留“最后一行”(根据
order by
)的值。Online example
关于json - 在postgres查询中执行“运行json串联”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53112968/