2016-06-01 4 views
0

Я записываю время для каждой операции, когда она начинается, и когда она заканчивается, и как они являются разными операциями, я генерирую несколько строк, которые я хотел бы консолидировать время начала и конец, если и только если в течение следующей минуты записывается следующая операция. Если вы проводите более одной минуты, это считается другой консолидированной строкой. ПримерОбъединить строки в SQL Server

СУБД SQL Server 2008 R2

ID | PERSON | START | END | OP |TYPE 1 |2001668 |27/04/2016 22:58|27/04/2016 22:59|5901430|19 2 |2001668 |27/04/2016 23:00|27/04/2016 23:19|5901430|19 3 |2001326 |20/11/2009 04:16|20/11/2009 04:27|5901444|21 4 |2001668 |28/04/2016 11:19|28/04/2016 11:32|5901430|19

Я хотел бы результаты выглядеть следующим образом:

PERSON | START | END | OP |TYPE 2001668 |27/04/2016 22:58|27/04/2016 11:19|5901430|19 2001326 |20/11/2009 04:16|20/11/2009 04:27|5901444|21 2001668 |28/04/2016 11:19|28/04/2016 11:32|5901430|19

+1

Вы, вероятно, хотите для использования курсора. Если у вас была более поздняя версия SQL Server, вы можете использовать 'lag()/lead()'. Скорее всего, решения этой проблемы уже возникнут в других вопросах Stackoverflow. – shawnt00

+0

Это может помочь: http://stackoverflow.com/questions/24244659/group-consecutive-rows-of-same-value-using-time-spans http://stackoverflow.com/questions/15161262/merge-adjacent- rows-in-sql – shawnt00

+0

Вот отличное место для начала. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

ответ

0

Попробуйте

declare @tb table (username varchar(10),starttime datetime,endtime datetime) 
insert into @tb values('0100810','2016-01-04 16:00','2016-01-04 17:00') 
insert into @tb values('0100810','2016-01-04 17:01','2016-01-04 17:20') 
insert into @tb values('0100820','2016-01-04 18:00','2016-01-04 19:00') 

insert into @tb values('0100810','2016-01-04 17:22','2016-01-04 17:30'); 

--select username,DATEADD(MINUTE,1,starttime) st, starttime,endtime from @tb 
WITH StartTimes AS 
(
    SELECT DISTINCT username, starttime 
    FROM @tb AS S1 
    WHERE NOT EXISTS 
    (SELECT * FROM @tb AS S2 
    WHERE S2.username = S1.username 
     AND S2.starttime < S1.starttime 
     AND DATEADD(MINUTE,1,S2.endtime) >=S1.starttime) 
), 
EndTimes AS 
(
    SELECT DISTINCT username, endtime 
    FROM @tb AS S1 
    WHERE NOT EXISTS 
    (SELECT * FROM @tb AS S2 
    WHERE S2.username = S1.username 
     AND S2.endtime > S1.endtime 
     AND S2.starttime <= DATEADD(MINUTE,1,S1.endtime)) 
) 
SELECT username, starttime, 
    (SELECT MIN(endtime) FROM EndTimes AS E 
    WHERE E.username = S.username 
    AND DATEADD(MINUTE,1,E.endtime) >= starttime) AS endtime 
FROM StartTimes AS S; 
Смежные вопросы