我想找出每个讲师的最大并行能力。如果两个课程持续时间之间有1天的重叠,那么它们被认为是并行的。我想得到F列中的输出。
在Oracle SQL中是否有实现此输出的方法?
创建数据的脚本-
create table instructor_schedule(instructor_id varchar2(5), course_id varchar2(5), course_start_dt date, course_end_dt date);
insert into instructor_schedule(instructor_id, course_id, course_start_dt, course_end_dt) values('I1', 'C1', to_date('01-JAN-2022', 'DD-MON-YYYY'), to_date('30-JAN-2022', 'DD-MON-YYYY'));
insert into instructor_schedule(instructor_id, course_id, course_start_dt, course_end_dt) values('I1', 'C2', to_date('25-DEC-2021', 'DD-MON-YYYY'), to_date('15-JAN-2022', 'DD-MON-YYYY'));
insert into instructor_schedule(instructor_id, course_id, course_start_dt, course_end_dt) values('I1', 'C3', to_date('25-JAN-2022', 'DD-MON-YYYY'), to_date('05-FEB-2022', 'DD-MON-YYYY'));
insert into instructor_schedule(instructor_id, course_id, course_start_dt, course_end_dt) values('I1', 'C4', to_date('26-JAN-2022', 'DD-MON-YYYY'), to_date('26-JAN-2022', 'DD-MON-YYYY'));
insert into instructor_schedule(instructor_id, course_id, course_start_dt, course_end_dt) values('I1', 'C5', to_date('01-MAR-2022', 'DD-MON-YYYY'), to_date('05-MAR-2022', 'DD-MON-YYYY'));
insert into instructor_schedule(instructor_id, course_id, course_start_dt, course_end_dt) values('I2', 'C1', to_date('20-AUG-2022', 'DD-MON-YYYY'), to_date('22-AUG-2022', 'DD-MON-YYYY'));
insert into instructor_schedule(instructor_id, course_id, course_start_dt, course_end_dt) values('I2', 'C2', to_date('03-SEP-2022', 'DD-MON-YYYY'), to_date('04-SEP-2022', 'DD-MON-YYYY'));
insert into instructor_schedule(instructor_id, course_id, course_start_dt, course_end_dt) values('I2', 'C3', to_date('02-SEP-2022', 'DD-MON-YYYY'), to_date('02-SEP-2022', 'DD-MON-YYYY'));
insert into instructor_schedule(instructor_id, course_id, course_start_dt, course_end_dt) values('I2', 'C4', to_date('01-SEP-2022', 'DD-MON-YYYY'), to_date('05-SEP-2022', 'DD-MON-YYYY'));
3条答案
按热度按时间rvpgvaaj1#
您可以将标量子查询与相交间隔上的条件一起使用:
| 讲师ID|课程编号|课程开始日期|课程结束日期|交叉点|
| - ------|- ------|- ------|- ------|- ------|
| I1| C1| 2022年1月1日|2022年1月30日|三个|
| I1| C2|二〇二一年十二月二十五日|2022年1月15日|1个|
| I1| C3| 2022年1月25日|2022年2月5日|第二章|
| I1|四碳|2022年1月26日|2022年1月26日|第二章|
| I1| C5|二○二二年三月一日|2022年3月5日|无|
| I2| C1|二〇二二年八月二十日|二〇二二年八月二十二日|无|
| I2| C2| 2022年9月3日|2022年9月4日|1个|
| I2| C3| 2022年9月2日|2022年9月2日|1个|
| I2|四碳|2022年9月1日|2022年9月5日|第二章|
fiddle
统一采购司
或者,您可以使用单个表扫描和
model
子句对多行执行计算。下面的cv
表示指定维的当前值,括号[...]
用于引用维值。| 讲师ID|课程编号|课程开始日期|课程结束日期|交叉点|并行课程|最大盖法兰|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| I1| C1| 2022年1月1日|2022年1月30日|三个|C4、C3、C2| 1个|
| I1| C2|二〇二一年十二月二十五日|2022年1月15日|1个|C1| * 无效 *|
| I1| C3| 2022年1月25日|2022年2月5日|第二章|C4、C1| * 无效 *|
| I1|四碳|2022年1月26日|2022年1月26日|第二章|C3、C1| * 无效 *|
| I1| C5|二○二二年三月一日|2022年3月5日|无| * 无效 | 无效 *|
| I2| C1|二〇二二年八月二十日|二〇二二年八月二十二日|无| * 无效 | 无效 *|
| I2| C2| 2022年9月3日|2022年9月4日|1个|四碳| * 无效 *|
| I2| C3| 2022年9月2日|2022年9月2日|1个|四碳| * 无效 *|
| I2|四碳|2022年9月1日|2022年9月5日|第二章|C3、C2| 1个|
fiddle
qcbq4gxm2#
您可以使用
outer apply
(至少在Oracle的最新版本中)来获取重叠的课程,然后聚合这些课程:| 讲师ID|课程编号|课程开始日期|课程结束日期|其他_ID|其他_计数|
| - ------|- ------|- ------|- ------|- ------|- ------|
| I1| C1| 2022年1月1日|2022年1月30日|C2、C3、C4炸药|三个|
| I1| C2|二十一年十二月二十五日|二十二年一月十五日|C1| 1个|
| I1| C3| 2022年1月25日|2022年2月5日|C1、C4|第二章|
| I1|四碳|2022年1月26日|2022年1月26日|C1、C3|第二章|
| I1| C5| 2022年3月1日|2022年3月5日|无|无|
| I2| C1| 2022年8月20日|2022年8月22日|无|无|
| I2| C2| 2022年9月3日|2022年9月4日|四碳|1个|
| I2| C3| 2022年9月2日|2022年9月2日|四碳|1个|
| I2|四碳|2022年9月1日|2022年9月5日|C2、C3|第二章|
fiddle
这得到的结果与您所展示的略有不同,但看起来讲师I1的C3和C4应该彼此重叠...
g52tjvyc3#
仅使用解析函数和CASE表达式...