2015-03-31 46 views
0

我在记录中发生某些事情时记录SQL中的开始和结束时间,基本上用户打开包含记录中信息的屏幕,并且我想查看屏幕已打开多长时间。在SQL中结合行

我记录的开始时间,并在舞台的情况下一起结束目前在这种情况下,链接表中与此类似:

 
| Id  | Reference | Stage | StartTime     | EndTime      | 
| 1   | 123456789 | NEW | 2015-03-30 16:04:39.8100000 | NULL      |     
| 2   | 123456789 | NEW | NULL      | 2015-03-30 16:06:44.3830000 | 
| 3   | 123456789 | VAL | 2015-03-30 16:09:00.3800000 | NULL      | 
| 4   | 123456789 | VAL | NULL      | 2015-03-30 16:11:04.9870000 | 
| 5   | 123456789 | CAP | 2015-03-30 16:20:25.7900000 | NULL      | 
| 6   | 123456789 | CAP | NULL      | 2015-03-30 16:21:12.1130000 | 
| 7   | 123456789 | CAP | 2015-03-30 16:22:40.4930000 | NULL      | 
| 8   | 123456789 | CAP | NULL      | 2015-03-30 16:29:02.5030000 | 
| 9   | 123456789 | CAP | 2015-03-30 16:29:17.8970000 | NULL      | 
| 10  | 123456789 | CAP | NULL      | 2015-03-30 16:55:13.8870000 | 
| 11  | 123456789 | CAP | 2015-03-30 16:56:20.2230000 | NULL      | 
| 12  | 123456789 | CAP | NULL      | 2015-03-30 16:56:40.3830000 | 

我一直在玩周围,但无法得到想要的结果:

 
| Id  | Reference | Stage | StartTime     | EndTime      | 
| 1   | 123456789 | NEW | 2015-03-30 16:04:39.8100000 | 2015-03-30 16:06:44.3830000 | 
| 3   | 123456789 | VAL | 2015-03-30 16:09:00.3800000 | 2015-03-30 16:11:04.9870000 | 
| 5   | 123456789 | CAP | 2015-03-30 16:20:25.7900000 | 2015-03-30 16:21:12.1130000 | 
| 7   | 123456789 | CAP | 2015-03-30 16:22:40.4930000 | 2015-03-30 16:29:02.5030000 | 
| 9   | 123456789 | CAP | 2015-03-30 16:29:17.8970000 | 2015-03-30 16:55:13.8870000 | 
| 11  | 123456789 | CAP | 2015-03-30 16:56:20.2230000 | 2015-03-30 16:56:40.3830000 | 

在这种情况下,我如何组合数据(开始和结束时间)?

+0

您必须在插入EndTime时放置条件startTime是否存在此引用?并只更新行。根据你的情况,你应该更新Endtime的表格。 – Ajay 2015-03-31 09:38:42

+0

这是我的第一个方法,但我想保持一个很好的审计跟踪,并且当多次打开一个屏幕时,更新与引用混淆了。所以我去了另一条路线,这使得事情变得更加困难,但是正常工作。 – 2015-03-31 10:14:10

回答

1

您可以选择开始时间行和一个有内选择填充结束时间:

SELECT Id, Reference, Stage, StartTime, 
      (SELECT t1i.EndTime FROM Table1 t1i WHERE t1.Stage = t1i.Stage And t1i.StartTime IS NULL 
      And t1i.Id = (SELECT min(t1ii.Id) FROM t1ii WHERE t1ii.StartTime IS NULL And t1ii.Stage = t1.Stage And t1ii.Id > t1.Id)) 
FROM Table1 t1 
WHERE t1.EndTime IS NULLL 
+0

- 。 (SELECT TOP 1 t1.EndTime \t FROM vCISStartEndTime1 T1 \t其中T1 [队列] = T [队列] \t \t AND t1.Reference = t.Reference \t \t AND t1.StartTime IS NULL \t \t AND t1.Id> t.Id ) '结束时间' – 2015-03-31 14:03:43

0

尝试类似:

SELECT MIN(id), reference, stage, MAX(startTime), MAX(endTime) 
FROM mytable 
GROUP BY reference, stage 
ORDER BY id 
+0

这不会起作用,因为用户可以在同一阶段多次打开屏幕,并且这仅适用于一次打开的屏幕这实际上与溶液提供我每个阶段.. :( – 2015-03-31 10:04:49

1
SELECT * FROM (
SELECT [Id], [Reference], [Stage], [StartTime],lead(EndTime) OVER (ORDER BY ID) AS NewEndDate FROM yourTablename 
) tbl 
WHERE id % 2 = 1 

编辑:此查询将在SQL Server 2012中工作及以上版本

您可以使用以下查询如果您使用的是旧版本的SQL Server:

SELECT * FROM (
SELECT t.[Id], t.[Reference], t.[Stage], t.[StartTime], tnext.[EndTime] 
FROM dates t INNER JOIN 
dates tnext 
ON t.id = tnext.id - 1 
) tbl 
WHERE id % 2 = 1 
+0

天才。这是如此简单,完美的作品:D – 2015-03-31 10:05:21

+0

EDIT打破了我的世界。我需要这个工作在SQL Server 2008 R2 – 2015-03-31 10:25:03

+0

@JohanAspeling,答案更新为SQL Server 2008 R2和SQL Server的旧版本 – Cylar 2015-03-31 11:41:43