我有一个像酒店系统一样工作的表,包含入住和退房日期。我想在这里做的是,我想看看一个月有多少天是空闲的。比如说;
| 名称|入住登记|退房|
| --|--|--|
| 乔伊·佐洛蒙|2019 - 05 - 21 00:00:00| 2019 - 08 - 15|
| 亨特·佐勒蒙|2019 - 08 - 15| 2019 - 08 - 26|
| 巴里艾伦|2019 - 02 - 21 10:00:00| 2019 - 05 - 21 10:00:00|
我需要输出像这样;
| 月|免费_天数|
| --|--|
| 2023年08月08日| 8 |
| 2023年9月| 26 |
提前感谢大家!!!
2条答案
按热度按时间js5cn81o1#
这里有一个选择;读取代码中的注解:
测试结果:
r7xajy2e2#
您不需要在一个月的每一天都生成;相反,您可以将已有的行拆分为单独的月份,然后使用
UNPIVOT
并使用分析函数来查找人员进入和离开的累积计数,并使用该计数来生成空闲天数(这将需要您生成的行明显少于每月或每年的天数,并且没有连接)。其中,对于样本数据:
输出:
| 月|NUM_FREE_DAYS|
| --|--|
| 2019 -08-01 00:00:00| 9 |
| 2023-09-01 00:00:00| 26 |
如果您想查看每个月的空闲天数范围,那么查询的最后一部分可以调整为:
其输出:
| 开始_免费|FREE_END|天|
| --|--|--|
| 2019 -08-01 00:00:00| 2019 -08-05 00:00:00| 4 |
| 2023-08-27 00:00:00| 2023-09-01 00:00:00| 5 |
| 2023-09-01 00:00:00| 2019 -09-02 00:00:00| 1 |
| 2023-09-06 00:00:00| 2023-10-01 00:00:00| 25 |
在Oracle 12中,您还可以使用
MATCH_RECOGNIZE
进行逐行模式匹配,以查找重叠(以及每个重叠之前和之后的间隙),然后可以拆分为月份并进行聚合:fiddle