sql - 如何构建 SQL 以按日期获取分组数据
问题描述
我在 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
我需要返回响应 group_by 日期的 SQL,如果事件持续时间(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 吗?
解决方案
如果您只需要行,则只需要以下步骤:
- 将两个日期聚合到一个数组中
ARRAY[]
unnest()
扩展每个日期的数据。DISTINCT
消除所有绑定元素 wherestart_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
推荐阅读
- swift - 为什么我要在 Swift 中使用类型转换?
- spring-boot - gradle 导入具有传递依赖的本地 jar
- android - 从 Glide 分享图片
- unity3d - Unity:VideoPlayer 使用 .webm 视频冻结半秒
- php - 将 PHP for 循环转换为 for each
- java - 无法从 Java 中读取 C++ 中保存的 Opencv Mat 图像
- c# - Json.NET - 在 winforms 中反序列化和解析 json 数据
- oracle - 登录sqlplus并在dockerfile中执行sql文件
- xslt-2.0 - XML合并两个文件不起作用
- python - 如何根据每日价格数据计算月收益?