在SQL Server中组合行

时间:2016-06-01 17:38:19

标签: sql sql-server sql-server-2008-r2

我记录每个操作在启动时和结束时的记录时间以及它们如何在不同的操作中生成多行,我希望合并开始时间并结束当且仅当以下操作时在下一分钟内录制。如果您花费超过一分钟,则将其视为另一个合并行。实施例

dbms是sql server 2008 R2

>

我希望结果如下:

-1

1 个答案:

答案 0 :(得分: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;