json - 在 postgres 查询中执行 "running json concatenation"

标签 json postgresql jsonb

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

相关文章:

php - 在 PHP 中将类的静态成员编码为 JSON

java - javascript 中的 JSON 字符编码与 java 不同

django - docker-compose 不启动 postgres

sql - 从 Postgres 中的子查询构造值的 ARRAY 并在 WHERE 子句中使用它

postgresql - Postgres 9.6 - jsonb 列中特定字段的平均值,并按同一 jsonb 列上的另一个字段进行分组

jquery - 通过重复键合并数组的值

json - 格式化 SpaCy NER 的训练数据集

database - GO 打开本地 postgres 连接

python - Django:数据库级别或代码级别的TextField(字符串)数据压缩

json - 在postgres中将jsonb转换为jsonb数组