我在 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 吗?
最佳答案
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
- 使用
row_to_json
将表格转换为 json 对象。 - 使用
ARRAY[]
将两个日期聚合到一个数组中 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"}
DISTINCT
消除所有start_date == end_date
的绑定(bind)元素。- 按日期分组,将 json 元素聚合成一个 json 数组 (
jsonb_agg
) - 毕竟,使用
key == date
和value == json array
将表分组为 json 元素 (jsonb_object_agg
)
关于sql - 如何构建 SQL 以按日期获取分组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52945704/