【发布时间】:2020-10-10 09:43:28
【问题描述】:
我需要将订单组合在一起,只需要跨越他们的日期范围
场景 A.
- 订单 1,1.3.2020-30.6.2020
- 订单 2,1.5.2020-31.8.2020
- 订单 3,31.7.2020-31.10.2020
- 订单 4,31.7.2020-31.12.2020
所以输出应该是
- 订单 1,订单 2
- 订单 2,订单 3,订单 4
order1,3,4 没有分组,因为它们的范围根本不交叉
场景 B.
同上,另加订单
- 订单 5,1.1.2020-31.12.2020
所以输出将是
- 订单 1,订单 2,订单 5
- 订单 2,订单 3,订单 4,订单 5
我尝试使用 Self Join 来检查哪个开始日期在该范围内。 所以在订单 1 的范围内,只有订单 2 的开始日期 -> 我们有一组 然后在订单 2 的范围内,订单 3 和 4 的开始日期都下降 -> 我们有第二组 但随后订单 3 落在订单 4 的开始日期和相反 -> 这将给出另外 2 个组,但它们是无效的,因为订单 2 也跨越了它们的日期范围,也应该包括在内,因为我们应该有 3 次重复在所需的输出中只显示一次,但这种方法会失败。
谢谢
【问题讨论】:
-
可能对我来说太难理解了,但你能解释一下在第一种情况下分组是如何完成的
order 1, order 2和order 2, order 3, order 4吗? -
组仅针对日期范围交叉的订单进行,因此第 1 组是订单 1 和 2,第 2 组是订单 2,3 和 4。组中的所有订单必须包含交叉日期范围。订单 1、2、3、4 的组将无效,因为日期范围或订单 1 不与日期范围或订单 3 和 4 交叉。同样,订单 3 和 4 的组将无效,因为订单 2 必须包含在好
-
为什么订单 3 和 4 是无效组,如果必须包括订单 2,以及当订单 1 可以与订单 2 位于同一组时,为什么订单 2、3 和 4 是有效组?我无法调和这两个语句之间的逻辑。
-
由于日期范围的原因,您不能将订单 1 与订单 3 和 4 放在同一组中,订单 1 结束于 30.6,但订单 3 和 4 开始于 31.7,它们不会相互交叉.如果没有另一个订单(在本例中为订单 2),其日期范围跨越这两个订单,则订单 3 和 4 组将有效。我只想要日期范围相互重叠的订单组。因此,您不能拥有第 1、2、3、4 组,因为并非所有这些都以某种方式相互交叉,并且类似地适用于第 3 和第 4 组,因为将缺少交叉它们的第 2 组。
-
请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)的 SQL,并以表格格式作为代码输入。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你期望的内容和原因。
标签: oracle group-by self-join gaps-and-islands