这可能是个小问题,但我想知道postgres json输出的功能。
下表:
id | seconds | datetime
1 | 10 | 2020-08-21 08:42:58.26+08
2 | 20 | 2020-08-21 10:20:00.01+08
3 | 10 | 2020-08-22 08:00:00.10+08
这样可以在json中输出吗?
[{
"date" : "2020-08-21",
"seconds_1" : 10,
"seconds_2" : 20,
},
{
"date" : "2020-08-22",
"seconds_1" : 10
}]
我可以通过php/javascript操作表结果,但只是想知道这在postgres中是否可行。
这需要多步骤聚合:
select jsonb_agg(item)
from (
select jsonb_build_object('date', dt)|| jsonb_object_agg(concat('seconds_', rn), seconds) item
from (
select datetime::date as dt,
row_number() over (partition by datetime::date) as rn,
seconds
from the_table
) t
group by dt
) r
最内部的查询用于按日期对行进行编号,这不能在按日期分组的同一级别上完成,因为这样的编号就会错误(因为窗口函数在分组后进行评估(
第二级聚合所有";秒";为每个日期创建一个JSON值。最后一级将所有内容聚合到一个JSON数组中。
在线示例
如果你不关心使";秒";密钥唯一,您可以使用id
列并稍微简化查询:
select jsonb_agg(item)
from (
select jsonb_build_object('date', datetime::date)|| jsonb_object_agg(concat('seconds_', id), seconds) item
from the_table
group by datetime::date
) r