>我在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日期返回我的响应,如果事件持续时间(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
- 使用
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
中的所有绑定元素。- 按日期分组,将 JSON 元素聚合成一个 JSON 数组 (
jsonb_agg
( - 毕竟,将表分组为 JSON 元素 (
jsonb_object_agg
( 与key == date
和value == json array
如果您只需要行,则只需要以下步骤:
- 使用
ARRAY[]
将两个日期聚合到一个数组中 unnest()
扩展每个日期的数据。DISTINCT
消除了start_date == end_date
的所有捆绑元素。
查询:
SELECT DISTINCT
unnest(ARRAY[start_date::date, end_date::date]) as dates,
*
FROM
events
结果:
dates id name start_date end_date
2018-09-14 1 Event1 2018-09-14 14:22:00 2018-09-15 14:22:00
2018-09-15 1 Event1 2018-09-14 14:22:00 2018-09-15 14:22:00
2018-09-15 2 Event2 2018-09-15 14:22:00 2018-09-15 15:22:00
演示:数据库<>小提琴