显然我无法解决这个问题。所以,我正在使用这样的2个表: 表教室:
CLASSROOMS
----------
Num | Type
__________
1 |'Normal'
2 |'Normal'
3 |'Normal'
1 |'Lab'
2 |'Lab'
表类:
CLASSES
-------------------------
s_h | f_h | num | type
_________________________
8:30 |10:30| 1 | 'Normal'
8:30 |10:30| 1 | 'Lab'
8:30 |10:30| 2 | 'Normal'
10:30|12:30| 1 | 'Normal'
12:30|14:30| 2 | 'Lab'
我基本上想通过在第二张表格中插入一行来预约教室。插入应该通过程序进行。给定偏好的开始和结束时间的这个过程应该基本上看起来是一个空的教室,如果没有任何返回表,每个类的任何可用时间。 现在,假设没有time_scheduling确定类的格式和长度,我只知道学校有开放时间和结束时间,我怎样才能找到这样的结果集?让我们看一个例子来澄清我想要实现的目标。考虑最简单的例子。两个相同类型的教室。
CLASSROOMS
----------
Num | Type
__________
1 |'Normal'
2 |'Normal'
让我们进一步考虑第一个教室从10:00到13:00被占用,第二个教室从9:00到13:00被占用,第一个教室有三个班,每个班1小时,第二个班有两个班两个小时我们将有一个看起来像这样的表:
表类:
CLASSES
-------------------------
s_h | f_h | num | type
_________________________
10:00|11:00| 1 | 'Normal'
11:00|12:00| 1 | 'Normal'
12:00|13:00| 1 | 'Normal'
09:00|11:00| 2 | 'Normal'
11:00|13:00| 2 | 'Normal'
现在,从这张表中我想构建一个表格,告诉我基本上每个班级都可以自由预订。在这种情况下基本上是这样的: (可能有一种更简单的方法,我不确定)
FREE
-----------------------------
s_h | f_h | num | type
_____________________________
08:00|10:00| 1 | 'normal'
13:00|14:00| 1 | 'normal'
8:00|09:00| 2 | 'normal'
13:00|14:00| 2 | 'normal'
我怎样才能获得这样的结果?
我到目前为止唯一的困难是创建一个每个可能时间的表,然后做类似减去这个表的类,但当然它不会先工作因为我应该根据我想要多少精确度来转换多行的每一课结果是,第二,因为这第二个表将导致太大。所以基本上是最天真的解决方案。 好吧......为你的努力提供2个便士。
答案 0 :(得分:3)
现在这个有效。首先在类表中插入行,指定类的打开和关闭时间
insert into classes
select '' as s_h,'08:00:00' as f_h, num, type from classrooms
union
select '14:00:00' as s_h,'' as f_h, num, type from classrooms;
在此之后,我使用row_number() over (partition by num order by s_h)
按每个教室的开始时间对班级进行排名。这看起来像这样
select *, row_number() over (partition by num order by s_h) as rn from classes
使用相同的查询两次并将第一个表(子查询)的一行连接到num的第二个表(同一个查询)a.rn=b.rn-1
的下一行,给出了一系列类。就像一个班级跟着其他班级一样。现在我通过编写where where a.f_h!=b.s_h
select a.num,a.f_h, b.s_h from
(select *, row_number() over (partition by num order by s_h) as rn from classes) as a
join
(select *, row_number() over (partition by num order by s_h) as rn from classes) as b
on a.num=b.num and a.rn=b.rn-1
where a.f_h!=b.s_h
中间只是一个解释,使用插入查询和上面的查询,你应该很好。 http://sqlfiddle.com/#!6/51fe3/12
如果您需要进一步的帮助,请告诉我。