2015-03-18 2 views
1

Я не могу обернуть свой разум вокруг этой проблемы. Таким образом, я использую 2 таблицы, как это: Таблица Классные:Найдите пустые классные комнаты в оракуле sql

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' 

Я в принципе хочу, чтобы зарезервировать класс, вставив строку вставки 2 table.the должны выполняться посредством процедуры. эта процедура, учитывая начальное и конечное время предпочтения, должна выглядеть в основном для пустого класса и если нет возврата таблицы любого доступного времени для каждого класса. Теперь, предполагая, что нет времени_заследования, которые определяют формат и длину классов, и я знаю только, что в школе есть время открытия и закрытия, как я могу найти такой набор результатов? Давайте посмотрим на пример, чтобы прояснить, чего я пытаюсь достичь. Рассмотрим простейший пример. Два классных комнаты того же типа.

CLASSROOMS 
---------- 
Num | Type 
__________ 
1 |'Normal' 
2 |'Normal' 

Давайте далее рассмотрим, что первый класс занят с 10:00 до 13:00, а второй с 9:00 до 13:00, то первый из них имеет три класса 1 час каждый, а второй у одного есть два часа. Мы Therfore есть таблица выглядит следующим образом:

Таблица Классы:

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' 

, как я могу получить такой результат?

Моей единственной сложной задачей было создание таблицы всех возможных времен, а затем делать что-то вроде классов минус эта таблица, но, конечно, она не будет работать сначала, потому что я должен преобразовать каждый урок в несколько строк на основе того, насколько точны i хотите, чтобы результат был, и второй, потому что эта вторая таблица будет слишком большой. Так что в основном самое наивное решение есть. Так хорошо ... 2 pennys для ваших стриттов.

+0

Похоже, вы хотите сделать «@ DATEDIFF» со временем; 'JOIN' все таблицы и' @ DATEDIFF' между 's_h' и' f_h' не равны 0, тогда класс должен быть доступен. –

+0

Это очень неопределенный ответ, не могли бы вы разоблачить свою идею дальше? – darkpirate

+0

Эта проблема планирования на самом деле довольно сложно решить в SQL, поскольку SQL работает со строками и работает с сеткой с сеткой. – APC

ответ

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 

Используя тот же запрос дважды и присоединение к одной строке первой таблицы (к югу от запроса) к следующей строке второй таблицы (тот же запрос) a.rn=b.rn-1 на пит дает мне последовательность классов. Как и один класс, следует другой класс. Теперь я ликвидация классов, которые являются непрерывными в письменной форме, где положение 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

Дайте мне знать, если вам нужна дополнительная помощь.

+0

ОК, это честно выглядит слишком сложно, мне очень нужна дополнительная помощь, чтобы понять, что вы делаете, спасибо. – darkpirate

+0

дайте мне знать, когда у вас есть время @Avinash – darkpirate

+0

Извините, я проверил это снова .. Это не работает более двух последовательных классов .. Я постараюсь придумать что-то еще – Avinash

Смежные вопросы