Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何聚合jsonb对象?_Postgresql - Fatal编程技术网

Postgresql 如何聚合jsonb对象?

Postgresql 如何聚合jsonb对象?,postgresql,Postgresql,我在表中有jsonb字段,其值如下: { "1":[{"start":64800,"finish":68400},{"start":61200,"finish":64800},{"start":75600,"finish":79200},{"start":79200,"finish":82800}], "2":[{"start":68400,"finish":72000},{"start":72000,"finish":75600},{"start":75600,"finish":79200},

我在表中有
jsonb
字段,其值如下:

{
"1":[{"start":64800,"finish":68400},{"start":61200,"finish":64800},{"start":75600,"finish":79200},{"start":79200,"finish":82800}],
"2":[{"start":68400,"finish":72000},{"start":72000,"finish":75600},{"start":75600,"finish":79200},{"start":79200,"finish":82800}],
"3":[{"start":46800,"finish":50400},{"start":50400,"finish":54000}],
"4":[{"start":50400,"finish":54000}],
"5":[{"start":79200,"finish":82800},{"start":82800,"finish":0},{"start":0,"finish":3600}],
"6":[{"start":68400,"finish":72000},{"start":72000,"finish":75600},{"start":79200,"finish":82800}]
}
每周0…6天,这是一系列的工作时间

所以我需要按一周中的天数累计工作时间。例如,一行具有

“5”:[{“开始”:79200,“完成”:82800},{“开始”:82800,“完成”:0},{“开始”:0,“完成”:3600}]

又一次争吵发生了

“5”:[{“开始”:75600,“完成”:79200}]

我想得到


“5”:[{“start”:75600,“finish”:79200},{“start”:79200,“finish”:82800},{“start”:82800,“finish”:0},{“start”:0,“finish”:3600}]

如果您需要手动和不定期运行此报告,您可以自己执行此操作。但是,如果性能对您很重要,您应该规范化您的模式(f.ex.如果您的
jsonb
列的结构如此简单,那么实际上根本不需要使用JSON:您没有任何非结构化数据)


如果有一个适当的标准化数据模型,这将是非常简单的。第一个数据集只有一行包含所有这些值?或者每行都是数据库中的一行?什么是Postgresql版本?我使用的是
Postgresql 9.6
,一行对应一个用户,字段包含一周中每天的工作时间。
SELECT jsonb_object_agg(dow, working_times_agg)
FROM   (SELECT     dow, jsonb_agg(working_time) working_times_agg
        FROM       table t,
                   jsonb_each(t.jsonb_column) o(dow, working_times),
                   jsonb_array_elements(working_times) working_time
        GROUP BY   dow) working_times_agg_by_dow