2017-01-10 6 views
0

я имею Reports таблицу в SQL Server, как это:Объединение записей в SQL Server по времени начала и окончания

Report Table

Мне нужно объединить записи в таблице с таким же CallNumber и type = Unanswered и разностной StartDate один рекорд и EndDate другой менее одного. Для примера разностной операции смотрите в следующем:

result table

Результат таблица выглядит так:

Result

я выполнить этот запрос для получить записи, которые должны быть сливаться, но я не знаете, как объединить эти записи.

select t1.CallNumber,t1.id,t1.EndDate,t2.Id,t2.StartDate 
from Reports as t1 
left join Reports as t2 on t1.CallNumber = t2.CallNumber and t1.type=t2.type 
where 
    t1.EndDate < t2.StartDate 
    and DATEDIFF(MINUTE,t1.EndDate,t2.StartDate) < 1 
    and t1.type = 'Unanswered' 
group by t1.CallNumber,t1.id,t1.EndDate,t2.Id,t2.StartDate 

Было бы очень полезно, если бы кто-то мог объяснить решение для запроса, которое возвращает таблицу результатов.

+0

Вам нужен запрос или вам необходимо удалить эти данные навсегда? –

+0

@GiorgiNakeuri Мне нужно запросить эту таблицу результатов возврата. –

+0

Я не уверен, что вы имеете в виду под «и StartDate одна запись, а EndDate другой меньше единицы». Я думал, что периоды должны быть непрерывными с одним периодом окончания и следующим стартом через секунду (как в первых двух примерах), но в третьем примере между записями есть 5 секунд. Итак, что означает эта фраза? –

ответ

1

Как это работает для вас?

declare @t table(ID int 
       ,Number int 
       ,StartDate datetime 
       ,EndDate datetime 
       ,Type nvarchar(50) 
       ); 
insert into @t values 
(1 ,2024,'20160102 16:40:00','20160102 16:40:15','Unanswered') 
,(2 ,2024,'20160102 16:40:16','20160102 16:40:32','Unanswered') 
,(3 ,2060,'20160102 16:40:33','20160102 16:40:48','Answered') 
,(4 ,2060,'20160102 16:42:00','20160102 16:42:10','Answered') 
,(11,2061,'20160102 16:50:00','20160102 16:50:10','Unanswered') 
,(12,2062,'20160102 16:50:14','20160102 16:50:24','Unanswered') 
,(13,2061,'20160102 16:50:30','20160102 16:50:44','Unanswered'); 

select * 
from @t t1 
    left join @t t2 
     on(t1.ID <> t2.ID 
      and t1.StartDate > t2.StartDate 
      and datediff(s, t2.EndDate, t1.StartDate) < 60 -- DATEDIFF only records boundaries crossed, so 14:34:59 to 14:35:00 would count as 1 minute despite actually being just 1 second. 
      and t1.Type = t2.Type 
      and t1.Type = 'Unanswered' 
      ) 
where t2.ID is null; 
Смежные вопросы