sql - 如何构建 SQL 以按日期获取分组数据

标签 sql json postgresql

我在 Postgres 数据库中有这样的数据

 | id |  name  |    start_date       |      end_date       |
   1    Event1  2018-09-14 14:22:00     2018-09-15 14:22:00
   2    Event2  2018-09-15 14:22:00     2018-09-15 15:22:00

我需要 SQL 返回我的响应 group_by date 如果事件持续时间(end_date,start_date)花了 2 天,我需要在两天数组中返回他两次,这一切都应该按日期排序。所以响应应该是这样的。

{
  "2018-09-14": [
      {
        "id": 1,
        "name": "Event1",
        "start_date": "2018-09-14 14:22:00",
        "end_date": "2018-09-15 14:22:00",
    }],
    "2018-09-15": [{
        "id": 1,
        "name": "Event1",
        "start_date": "2018-09-14 14:22:00",
        "end_date": "2018-09-15 14:22:00",
    },
    {
        "id": 2,
        "name": "Event2",
        "start_date": "2018-09-15 14:22:00",
        "end_date": "2018-09-15 15:22:00",
    }]
 }

你能帮我处理这个 SQL 吗?

最佳答案

demo: db<>fiddle

SELECT 
    jsonb_object_agg(dates, data_array)
FROM (
    SELECT
        dates,
        jsonb_agg(data) as data_array
    FROM (
        SELECT DISTINCT
            unnest(ARRAY[start_date::date, end_date::date]) as dates,
            row_to_json(events)::jsonb as data
        FROM
            events
    )s
    GROUP BY dates
) s
  1. 使用 row_to_json 将表格转换为 json 对象。
  2. 使用 ARRAY[] 将两个日期聚合到一个数组中
  3. unnest() 用每个日期扩展数据。

目前的结果:

dates        data
2018-09-14   {"id": 1, "name": "Event1", "end_date": "2018-09-15 14:22:00", "start_date": "2018-09-14 14:22:00"}
2018-09-15   {"id": 1, "name": "Event1", "end_date": "2018-09-15 14:22:00", "start_date": "2018-09-14 14:22:00"}
2018-09-15   {"id": 2, "name": "Event2", "end_date": "2018-09-15 15:22:00", "start_date": "2018-09-15 14:22:00"}
2018-09-15   {"id": 2, "name": "Event2", "end_date": "2018-09-15 15:22:00", "start_date": "2018-09-15 14:22:00"}
  1. DISTINCT 消除所有 start_date == end_date 的绑定(bind)元素。
  2. 按日期分组,将 json 元素聚合成一个 json 数组 (jsonb_agg)
  3. 毕竟,使用 key == datevalue == json array 将表分组为 json 元素 (jsonb_object_agg)

关于sql - 如何构建 SQL 以按日期获取分组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52945704/

相关文章:

postgresql - 从 Debian Docker 容器连接到 Windows Postgres

sql - 使用 partition by 子句时如何在 Postgres 中选择特定分区

c# - 将此 Json 转换成 C# 中的正确类结构是什么?

java - 在没有代码生成器的情况下在 postgreSQL 上使用 Jooq 和 jsonb_agg?

java - 当没有标记所有内容时,如何使用 Gson 解析 Json 数据

python - 序列化包含 Django 查询集的对象

postgresql - 这是 plpgsql 的理想选择吗?

sql - 使用附加条件计算表中的非唯一行

sql - oracle join中如何根据列值仅获取一条记录

sql - 无法重命名临时表的列