2012-03-07 9 views
0

同様の(< 500ms)日時値を持つ行のペアをマージし、他の行をそのまま残すことはできますか?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ミリ秒のタイムスパン内でイベントを作成した場合、クエリはこれらの2つの行をマージし、「修正」としてイベントを置く必要があります。

結果は次のようになります。事前に

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

これはModified(merged)には完全に機能しますが、クエリーで「隣人」とUNION SELECTを持たない行を見つける方法をさまよっています... – buggy08

+0

@ buggy08うん、それを追加しました。理論的には、しかし、それは醜いです。 –

+0

おっと。/dohの2番目の部分でSELECTを逃しました –

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

基本的な優雅なアイデアですが、日時の値は、08:30:14.990と08:30:15:010のようなものである可能性があります。とにかくありがとう。 – buggy08

関連する問題