当前位置: 首页 > 知识库问答 >
问题:

从一组平面记录生成嵌套JSON的PostgreSQL方法

尹辰沛
2023-03-14

获取了故意未规范化的数据表:

SELECT location, day, title, teacher, "startTime", "endTime", canceled from "Schedules" ORDER by location, day, "startTime";

数据...

"First", 1, "Knitting 101", "Doe, John", "2019-02-19T09:00Z", "2019-02-19T11:00Z"
"First", 2, "Model Building 201", "Doe, Jane", "2019-02-20T09:00Z", "2019-02-20T11:00Z"
"Second", 1, "Rocks for Jocks 101", "Smith, Terry", "2019-02-19T09:00Z", "2019-02-19T11:00Z"
"Second", 2, "Speed Reading 101", "Case, Justin", "2019-02-20T09:00Z", "2019-02-20T11:00Z"

并希望生成此JSON:

[
  {
    "location": "First",
    "days": [
      {
        "day": 1,
        "classes": [
          {
            "title": "Knitting 101",
            "teacher": "Doe, John",
            "starts": "2019-02-19T09:00Z"
            "ends": "2019-02-19T11:00Z",
            "canceled": false
          }
          ... other classes
        ]
      }
      ... other days
    ]
  }
  ... other locations
]

当前正在使用JavaScript函数获取查询结果并将其嵌套。尝试使用此方法使用JSON函数失败:

  1. (从"时间表"位置中选择不同的位置ORDER BY位置)l
  2. (选择位置,天从"附表"GROUP BY位置ORDER BY位置,天)d
  3. (选择*从"时间表"按位置、日期、开始时间排序)c
  4. array_to_json(array_agg(row_to_json(l))
  5. array_to_json(array_agg(row_to_json(d)))子查询,其中d.location=l.location
  6. array_to_json(array_agg(row_to_json(c)))子查询,其中c.location=l.locationc.day=d.day

这是正确的方法还是我错过了一个更优雅的解决方案?

更新:@FXD提供的解决方案是从最详细的组织级别开始,向后工作。下面是工作查询(引用混合大小写对象的小调整:

SELECT array_to_json(array_agg("LocationClasses" ORDER BY Location)) AS "FullSchedule"
FROM (
    SELECT location, json_build_object('location', location, 'days', array_to_json(array_agg("LocationDayClasses" ORDER BY day))) AS "LocationClasses"
    FROM (
        SELECT location, day, json_build_object('day', day, 'classes', array_to_json(array_agg(json_build_object('title', title, 'teacher', teacher,'starts', "startTime", 'ends', "endTime", 'cancelled', canceled) ORDER BY "startTime"))) as "LocationDayClasses"
        FROM "Schedules"
        GROUP BY location, day
    ) T1
    GROUP BY location
) T2

共有1个答案

仇和蔼
2023-03-14

你的步骤是对的,但我的顺序相反
如果您构建类,将它们按位置/天分组,然后按位置分组所有天,最后将整个内容分组到一个记录中,则可以在一个查询中完成所有操作。

从下面的查询中,我建议您尝试查看T1子查询的功能,然后对T2子查询执行相同的操作。你会发现这并不复杂。

SELECT array_to_json(array_agg(LocationClasses ORDER BY Location)) AS FullSchedule
FROM (
    SELECT Location, json_build_object('location',Location, 'days', array_to_json(array_agg(LocationDayClasses ORDER BY day))) AS LocationClasses
    FROM (
        SELECT Location, day, json_build_object('day', Day, 'classes', array_to_json(array_agg(json_build_object('title',Title,'teacher',Teacher,'starts',Starts,'ends',Ends,'cancelled',false) ORDER BY starts))) as LocationDayClasses
        FROM Schedules
        GROUP BY Location, Day
    ) T1
    GROUP BY Location
) T2
 类似资料:
  • 问题内容: 在PostgreSQL 9.3.4上,我有一个称为“ person”的JSON类型列,并且其中存储的数据为format 。我想检索索引为0的狗的品种。这是我运行的两个查询: 不起作用 作品 为什么必须进行类型转换?效率低下吗?我是在做错什么,还是对Postgres JSON支持有必要? 问题答案: 这是因为运算符将JSON数组元素获取为文本。您需要强制转换以将其结果转换回JSON。 您

  • 在PostgreSQL 9.3.4中,我有一个名为“person”的JSON类型列,其中存储的数据格式为

  • 我试图写一个规范来使用jolt转换完成下面的转换。我需要将平面JSON转换成嵌套JSON。 输入数据与此问题几乎相同。 Link:将平面json转换为具有多个数组的嵌套Json,并使用Jolt transform在输出中保留空值 我在将平面 JSON 转换为嵌套 JSON 时遇到了一些问题。在这里,我想基于 stoptype 属性聚合数据。我使用 https://jolt-demo.appspot

  • 所以目前我看到的是这样的: 这是我目前编写的Jolt规范(编辑): 以及转换后的输出: 任何帮助都是非常感谢的。

  • 问题内容: 我正在开发一个使用Postgres 数据类型的Rails应用程序。我在名为的表中有一个JSON列。假设我有多个这样的条目: 我想做的是返回具有相同唱片集,src和背景的条目的不同组合(注意:在节点内,数组元素的顺序无关紧要)。例如,查询应将条目1,3作为一组进行匹配,将条目2与另一组进行匹配,依此类推。目标是找到前3个最常见的组合。我知道如何使用Ruby来执行此操作,但是我必须查询大量

  • 我的数据库中有一个名为“json”的表,有两列:“id”和“data” 目前只有一行存储在其中,id为1,数据为JSON结构: 我需要更新json的一个键:“Name here”必须变成“updated” 这就是我尝试的: 但我有一个错误: “更新”处或附近的语法错误