Сценарий T-SQL - логические проблемы с временной шкалой

Создаются и загружаются две временные таблицы ... Вот схема.

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 минут спустя, 16: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 - это, в конечном счете, вычисленное значение of 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.

И, чтобы еще больше усложнить ... приведенный выше пример состоял из двух строк, которые необходимо было объединить. Я наткнулся на запись, в которой было 30 последовательных 1-минутных записей, которые мне нужно было преобразовать в одну запись. К счастью, они не могут перекрываться (у вас не будет двух записей, занимающих одни и те же минуты), но я не думаю, что оператор соединения, который я рассматриваю выше, сработает для этого.

5
задан Stu 17 November 2010 в 19:54
поделиться