是否可以对 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
)将被保留。
关于json - 在 postgres 查询中执行 "running json concatenation",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53112968/