2012-03-07 39 views
0

是否有可能合併具有類似日期時間值(< 500毫秒)的行對,並保留其他行?T-SQL合併具有類似日期時間的行對

我的事件如下表:

ID DateTime     FileName Event 
================================================= 
001 2011-04-04 12:30:15.000 File_A Deleted 
002 2011-04-04 15:30:37.000 File_A Created 
003 2011-04-05 08:30:25.000 File_A Deleted 
004 2011-04-05 08:30:25.050 File_A Created 

如果我有一雙已刪除的和內部的500毫秒的時間跨度創建活動,查詢應合併這兩個行,並把事件稱爲「修改」。

的結果應該是:

DateTime     FileName Event 
============================================ 
2011-04-04 12:30:15.000 File_A Deleted 
2011-04-04 15:30:37.000 File_A Created 
2011-04-05 08:30:25.000 File_A Modified 

在此先感謝..

回答

0
SELECT t1.DateTime, t1.FileName, 'Modified' as Event 
FROM Table t1 
JOIN Table t2 ON DATEDIFF(millisecond, t1.DateTime, t2.DateTime) < 500 
       AND t1.Event = 'Deleted' AND t2.Event = 'Created' 
UNION ALL 
SELECT t3.DateTime, t3.FileName, t3.Event 
FROM Table t3 
WHERE NOT EXISTS(SELECT 1 
       FROM Table t4 
       JOIN Table t5 ON DATEDIFF(millisecond, t4.DateTime, t5.DateTime) < 500 
           AND t4.Event = 'Deleted' AND t5.Event = 'Created' 
           AND t3.ID IN (t4.ID, t5.ID) 
) 

......好吧,必須有一個更好的辦法將未合併的結果返回。但是這應該工作?

+0

它適用於修改(合併),但只是徘徊如何找出沒有「鄰居」和聯合選擇您的查詢行... – buggy08 2012-03-07 21:41:05

+0

@ buggy08是的,我補充說,它*應*工作,理論上講,但它很醜陋,imo。 – 2012-03-07 21:41:54

+0

哎呦。錯過了第二部分的SELECT,/ doh – 2012-03-07 21:46:36

0

試試這個:

select cast(DATEPART(hour, DateColumn) as varchar(2)) + ':' + cast(DATEPART(minute, DateColumn) as varchar(2)) + ':' + cast(DATEPART(second, DateColumn) as varchar(2)) as DateTime, 
max(filename) as FileName, Max(event) as event 
from table 
group by 
cast(DATEPART(hour, DateColumn) as varchar(2)) + ':' + cast(DATEPART(minute, DateColumn) as varchar(2)) + ':' + cast(DATEPART(second, DateColumn) as varchar(2)) as DateTime 
+0

Basicaly優雅的想法,但日期時間值可能是,例如:08:30:14.990和08:30:15:010,所以通過鑄造秒,因爲你建議不會找到它作爲配對,雖然他們是。不管怎麼說,還是要謝謝你。 – buggy08 2012-03-07 22:01:53

相關問題