我一直在努力合并oraclesql或pl/sql(databasestandardedition11gr2)中的datetime范围。
我正在尝试合并日期时间范围,以便
order_id start_date_time end_date_time
3933 04/02/2020 08:00:00 04/02/2020 12:00:00
3933 04/02/2020 13:30:00 04/02/2020 17:00:00
3933 04/02/2020 14:00:00 04/02/2020 19:00:00
3933 05/02/2020 13:40:12 05/02/2020 14:34:48
3933 05/02/2020 14:00:00 05/02/2020 18:55:12
3933 05/02/2020 14:49:48 05/02/2020 15:04:48
3933 06/02/2020 08:00:00 06/02/2020 12:00:00
3933 06/02/2020 13:30:00 06/02/2020 17:00:00
3933 06/02/2020 14:10:12 06/02/2020 18:49:48
3933 07/02/2020 08:00:00 07/02/2020 10:30:00
3933 07/02/2020 08:00:00 07/02/2020 12:00:00
3933 07/02/2020 13:30:00 07/02/2020 17:00:00
11919 14/05/2020 09:00:00 14/05/2020 17:00:00
11919 14/05/2020 09:00:00 14/05/2020 17:00:00
11919 14/05/2020 15:00:00 14/05/2020 16:30:00
11919 15/05/2020 08:40:12 15/05/2020 16:30:00
11919 15/05/2020 09:40:12 15/05/2020 16:30:00
11919 15/05/2020 10:15:00 15/05/2020 12:15:00
11919 15/05/2020 13:19:48 15/05/2020 16:00:00
11919 18/05/2020 08:49:48 18/05/2020 09:45:00
11919 18/05/2020 10:00:00 18/05/2020 17:00:00
11919 18/05/2020 10:00:00 18/05/2020 16:58:12
11919 18/05/2020 15:34:48 18/05/2020 16:10:12
11919 18/05/2020 16:30:00 18/05/2020 16:45:00
... ... ...
将转换为以下结果集
--after merge (this is the result I am seeking)
order_id start_date_time end_date_time
3933 04/02/2020 08:00:00 04/02/2020 12:00:00
3933 04/02/2020 13:30:00 04/02/2020 19:00:00
3933 05/02/2020 13:40:12 05/02/2020 18:55:12
3933 06/02/2020 08:00:00 06/02/2020 12:00:00
3933 06/02/2020 13:30:00 06/02/2020 18:49:48
3933 07/02/2020 08:00:00 07/02/2020 12:00:00
3933 07/02/2020 13:30:00 07/02/2020 17:00:00
11919 14/05/2020 09:00:00 14/05/2020 17:00:00
11919 15/05/2020 08:40:12 15/05/2020 16:30:00
11919 18/05/2020 08:49:48 18/05/2020 17:00:00
... ... ...
开始日期时间和结束日期时间的格式为日/月/年hh24:mi:ss。
关于如何在oraclesql或pl/sql中进行合并,有什么建议/解决方案吗?
我认为这是一个微不足道的问题,但我还没有找到一个解决办法在互联网上。
提前谢谢。
2条答案
按热度按时间ar7v8xwq1#
这是改编自这个答案,其中包含了代码的解释。所有的改变就是增加
PARTITION BY order_id
计算每个order_id
然后返回范围(而不是根据链接的答案返回值的总和):对于你的测试数据:
输出:
db<>在这里摆弄
uqdfh47h2#
下面的解决方案使用一种称为“组的开始”方法的通用方法。
其思想是按开始日期对间隔进行排序(分别针对每个id),并按如下方式将间隔分配给组。对于每个间隔,检查其开始时间是否严格大于前面所有间隔的最大结束时间。如果是,那就开始一个新的小组。剩下的很简单-只需从每个组中选择最小开始日期和最大结束日期。
下面是如何使用分析函数实现的:
一个有趣的问题是如何处理开放区间(例如
null
对于结束日期和时间,意思是“开放的未来”。查询可以相对容易地进行调整,以涵盖问题语句的此类扩展。