2015-03-31 17 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