我有像这样存储的机构记录数据:
Agreement ID Broker ID Broker_Eff_Dt Broker_Term_Dt Broker_Type
A001 Broker1 01-JUN-2015 13-JUN-2015 B
A001 Broker2 14-JUN-2015 21-AUG-2015 B
A001 Broker2 22-AUG-2015 30-SEP-2015 B
A001 AGENCY1 01-JUN-2015 31-DEC-9999 A
代理商(Broker_Type = A)通过协议ID与其经纪人(Broker_Type = B)相关联。在这种情况下,代理商终止日期是开放式的(这表明它是活跃的),而其所有经纪人都已被终止。
代理商在协议中最多只能拥有一个经纪人。
要求是拆分对应于其每个经纪商范围的代理商范围:
Agreement ID Broker ID Broker_Eff_Dt Broker_Term_Dt Broker_Type
A001 Broker1 01-JUN-2015 13-JUN-2015 B
A001 Broker2 14-JUN-2015 21-AUG-2015 B
A001 Broker2 22-AUG-2015 30-SEP-2015 B
A001 AGENCY1 01-JUN-2015 13-JUN-2015 A
A001 AGENCY1 14-JUN-2015 21-AUG-2015 A
A001 AGENCY1 22-AUG-2015 30-SEP-2015 A
A001 AGENCY1 01-OCT-2015 31-DEC-9999 A
请注意,代理商获得的跨度没有相应的代理商跨度。
代理商的跨度并不总是超过其经纪人的范围。如果它们一致,则代理商数量的跨度应与经纪人的数量相同。 例如:
Agreement ID Broker ID Broker_Eff_Dt Broker_Term_Dt Broker_Type
A001 AGENCY1 01-JUN-2015 13-JUN-2015 B
A001 AGENCY2 14-JUN-2015 21-AUG-2015 B
A001 AGENCY3 22-AUG-2015 30-SEP-2015 B
A001 Broker1 01-JUN-2015 30-SEP-2015 A
运行后:
Agreement ID Broker ID Broker_Eff_Dt Broker_Term_Dt Broker_Type
A001 Broker1 01-JUN-2015 13-JUN-2015 B
A001 Broker2 14-JUN-2015 21-AUG-2015 B
A001 Broker2 22-AUG-2015 30-SEP-2015 B
A001 AGENCY1 01-JUN-2015 13-JUN-2015 A
A001 AGENCY1 14-JUN-2015 21-AUG-2015 A
A001 AGENCY1 22-AUG-2015 30-SEP-2015 A
如果最后一个经纪商的跨度大于其代理商那么类似的事情应该发生在Broker跨度上。例如:
Agreement ID Broker ID Broker_Eff_Dt Broker_Term_Dt Broker_Type
A001 AGENCY1 01-JUN-2015 13-JUN-2015 B
A001 AGENCY2 14-JUN-2015 21-AUG-2015 B
A001 AGENCY3 22-AUG-2015 30-SEP-2015 B
A001 Broker1 01-JUN-2015 31-DEC-9999 A
在这种情况下,经纪人的任期应与其代理商相对应。
数据库是Oracle 11g。
我们可以在SQL中实现它(不使用任何游标),例如使用CONNECT BY?
由于