2016-12-22 10 views
0

私は何をしようとしているのは、互いに1秒以内に発生した同じobject_idを持つが、異なるclient_ipアドレスを持つすべてのレコードを見つけることです。2つの条件に基づいてすべてのレコードを検索する:時間とIP

以下は私が手動で見つけたいくつかの例ですが、特定の日付のテーブル内のすべてのレコードを識別できるようにしたいと考えています。

SELECT sa.client_ip, sa.action_occured, sa.[object_id] 
--INTO #TmpB 
FROM dbo.system_audit AS [sa] 
WHERE sa.action_id = 9111 AND sa.object_type_id = 9100 
AND sa.[object_id] IN (50017197, 50050471, 50100927,50145858,50144558); 

と結果:

IP and Action Occurred

サンプル・データは、スクリーンショットよりも役立つかもしれない:

client_ip      action_occured   object_id 
fe80::7996:b7de:c335:699b%12 2016-12-19 15:54:17.300 50017197 
fe80::e41f:6383:5d0d:7b3%3 2016-12-19 15:54:17.410 50017197 
fe80::e41f:6383:5d0d:7b3%3 2016-12-19 14:54:45.383 50050471 
fe80::2117:63d8:2b67:91ab%12 2016-12-19 14:54:46.303 50050471 
fe80::7996:b7de:c335:699b%12 2016-12-19 15:40:42.467 50100927 
fe80::e41f:6383:5d0d:7b3%3 2016-12-19 15:40:42.763 50100927 
fe80::7996:b7de:c335:699b%12 2016-12-19 14:12:54.147 50144558 
fe80::118c:f37b:336d:c1c0%12 2016-12-19 14:12:54.270 50144558 
fe80::b0de:8ce7:be87:582d%12 2016-12-19 14:20:30.770 50145858 
fe80::149b:f256:e64c:4d59%12 2016-12-19 14:20:31.380 50145858 

特定のobject_idを知らなくても、私は比較できな方法があります各レコードの1秒以内に発生したが、別のclient_ipを持つすべてのobject_idを見つけるためのレコード?

おかげで、

+0

あなたは、このいずれかをリード/ラグがあります。 action_occurredを使用して結果セットを注文し、datediffが1000ms未満の場合は、次の行を照会します。クエリを書き出しようとしますが、簡単な方法でサンプルデータを再現することはできません。 – dfundako

+0

ありがとう@dfundako - 私はLAG/LEADをチェックしますが、それを再現したい場合はサンプルデータも追加しました。 – MISNole

答えて

1

dfundakoによって示唆されるように、ここにあなたがLAG/LEADでそれを行うことができ仕方(とCTEは、明確にするため)です:

WITH augmentedData (client_ip, action_occurred, [object_id], prev_date, prev_ip, next_date, next_ip) 
AS 
(
    SELECT *, 
      LAG(action_occurred, 1) OVER (PARTITION BY [object_id] ORDER BY action_occurred) AS prev_date, 
      LAG(client_ip, 1)  OVER (PARTITION BY [object_id] ORDER BY action_occurred) AS prev_ip, 
      LEAD(action_occurred, 1) OVER (PARTITION BY [object_id] ORDER BY action_occurred) AS next_date, 
      LEAD(client_ip, 1)  OVER (PARTITION BY [object_id] ORDER BY action_occurred) AS next_ip 
    FROM system_audit 
) 

SELECT client_ip, 
     action_occurred, 
     [object_id] 
FROM augmentedData 
WHERE (DATEDIFF(MS,prev_date,action_occurred) < 1000 AND prev_ip <> client_ip) 
    OR (DATEDIFF(MS,action_occurred,next_date) < 1000 AND next_ip <> client_ip) 
ORDER BY action_occurred 
+0

ありがとうございます - 非常に便利です。 – MISNole

関連する問題