sql - 在 PostgreSQL 中创建嵌套 json blob

标签 sql json postgresql

我正在尝试从这样的表创建一个嵌套的 json:

+----------+---------+------------------------------+
| unixtime | assetid |             data             |
+----------+---------+------------------------------+
|       10 |      80 | {"inflow": 10, "outflow": 2} |
|       20 |      90 | {"inflow": 10, "outflow": 2} |
|       10 |      80 | {"inflow": 10, "outflow": 2} |
|       20 |      90 | {"inflow": 10, "outflow": 2} |
+----------+---------+------------------------------+

得到这样的东西:

{
    "10": {
        "80": {"inflow": 10, "outflow": 2},
        "90": {"inflow": 10, "outflow": 2}
    },
    "20": {
        "80": {"inflow": 10, "outflow": 2},
        "90": {"inflow": 10, "outflow": 2}
    }
}

我尝试递归地将 json 数据转换为文本,array_agg 然后使用 json_object 将结果转换为 json blob,但最终用转义斜杠 (\) 搞砸了 json 结构。

如有任何帮助,我们将不胜感激

这是数据的链接:

https://dbfiddle.uk/?rdbms=postgres_11&fiddle=26734e87d4b9aea4ceded4e414acec4c

谢谢。

最佳答案

您可以使用json_object_agg()函数:

....
, m as (
select
    unixdatetime,
    assetid,
    json_object(array_agg(description), array_agg(value::text))
    as value
from input_data
group by unixdatetime, assetid
), j as
(
select json_object_agg("assetid","value") as js,m."unixdatetime"
  from m
 group by "unixdatetime" 
)
select json_object_agg("unixdatetime",js)
  from j

关于sql - 在 PostgreSQL 中创建嵌套 json blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57525995/

相关文章:

ruby-on-rails - PG 类查询不起作用

mysql - 计算用户有多行的行数

sql - MySQL UNION 每隔一个打印一次

sql - 当 SELECT 语句不返回任何内容时,如何使用 COALESCE 返回值?

json - 在 Swift 5 中解析 JSON

mysql json数据类型在数组内搜索值

sql - MySQL比较来自同一列的计数

Mysql子查询还是多个查询?

javascript - 解析具有重复键的嵌套 JSON 对象(PHP 或 JS)

PostgreSQL CTE 记录作为函数的参数