Две временные таблицы создаются и затем загружаются ... Вот схема.
Create table #SH ([date] datetime,
sched_id int,
agent_id int)
Create table #SD (sched_id int,
start_minute int,
length int,
exception_code int)
(К сожалению, я не могу изменить схему и дизайн, обе временные таблицы загружаются из плоских файлов. При необходимости я могу представить и загрузить новые временные таблицы).
Немного предыстории - Таблица заголовков #SH содержит расписание лиц в виде «Start_minute» и идет за «schedule_length» в минутах. Например, если бы стартовая минута и продолжительность расписания были равны 480, это было бы читать как 8:00 (8:00 = 480 минута) и продолжалось до 16:00 (480 минут спустя, 4:00 = 960 минута)
Таблица #SD содержит исключения для заголовка. В приведенном выше примере у человека, вероятно, будет исключение для обеда, которое будет start_minute = 720 и длина 30 (12:00 - 12:30).
Дата и agent_id - единственное, что меня интересует из #SH, информация об исключениях в #sd - это то, что меня интересует.
Этот запрос работает:
Select [date],#sd.start_minute,#sd.length,#sd.start_minute + #sd.length as 'end_minute',agent_id
from #SH
inner join #SD on #SD.sched_id = #sh.sched_id
* end_minute - это, в конечном счете, вычисленное значение start + length = end
Это возвращает что-то вроде:
Date Start length end
1 2010-11-11 600 30 630
2 2010-11-11 630 40 670
3 2010-11-11 750 15 765
4 2010-11-11 800 40 840
Теперь я хотел бы сказать, что все кончено и ушло ... но проблемы с вводом данных существуют. В строках 1 и 2 время окончания строки 1 совпадает со временем начала в строке 2 и должно быть объединено, чтобы мои результаты выглядели так:
Date Start length end
1 2010-11-11 600 70 670
2 2010-11-11 750 15 765
3 2010-11-11 800 40 840
Есть идеи, как построить эту логику, чтобы я вернул 3 строки вместо 4? Сейчас я работаю над присоединением таблицы к себе на # sd1.start + # sd1.length = # sd2.start.
И, что еще больше усложнит ... приведенный выше пример состоял из 2 строк, которые нужно было объединить. Я натолкнулся на запись, в которой было 30 записей по 1 минуте подряд, которые мне нужно будет сделать в одной записи. К счастью, они не могут перекрываться (у вас не будет двух записей, занимающих одни и те же минуты), но я не думаю, что оператор соединения, который я рассматриваю выше, будет работать для этого.