1

所定のマージン (例: 2 秒) を超えないアクセス ログを破棄するクエリをスクリプト化する必要があります。つまり、各レコードが特定の日時にユーザーによって作成された場合、その日時が前のレコードの日時と比較して範囲を超えていない人を取得したくありません。例の方がわかりやすいと思います。

例:

LogIndex, UserID, Date / Time

1. 01551, 20.02.2013 17:41:45.000
2. 01551, 20.02.2013 17:41:45.900 *
3. 01551, 20.02.2013 17:41:46.150 *
4. 01551, 20.02.2013 20:41:47.000

5. 01552, 02/20/2013 17:42:45.000
6. 01552, 20.02.2013 17:42:46.000 *
7. 01552, 02/20/2013 19:45:45.000 *

日付/時刻が前のレコードから 2 秒のマージンを超えていないため、破棄するレコード。最初のケースでは、両方ともこのマージンを超えないため、2 つのレコードを破棄する必要があります。

一時テーブルを作成し、テストする前のレコードを追加するコードは次のとおりです。

CREATE TABLE # TEMP (LogIndex int, UserID nvarchar (10), LogTime datetime)

insert into # temp select 1, '01551 ', '20 / 02/2013 17:41:45.000'
insert into # temp select 2, '01551 ', '20 / 02/2013 17:41:45.900'
insert into # temp select 3, '01551 ', '20 / 02/2013 17:41:46.150'
insert into # temp select 4, '01551 ', '20 / 02/2013 20:41:47.000'
insert into # temp select 5, '01552 ', '20 / 02/2013 17:42:45.000'
insert into # temp select 6, '01552 ', '20 / 02/2013 17:42:46.000'
insert into # temp select 7, '01552 ', '20 / 02/2013 19:45:45.000'

select * from # temp

DROP TABLE # temp

前もって感謝します!

4

1 に答える 1

0

タスクを逆に解決することを考えたことはありますか?

INSERTアクセスログを格納するテーブルに -Trigger を作成し、前任者との時間差が定義したよりも小さいデータを拒否することができます。userIDデータが収集された後にタスクを解決するクエリを作成する代わりに、最後に保存されたデータを取得して現在のデータと比較する方が簡単なはずです。

INSERT-Triggerを使用して、これらのログを別のテーブルに保存することもできます(このデータはアクセス制御から取得されているため、これらのレコードを削除することはできませんよね?)

それにもかかわらず、後でクエリを介して物事を達成したい場合は、次のようなことを試してください。

WITH "CTE" AS
(
    SELECT 
        T1.* 
        , diff = DATEDIFF( MS, T2.LogTime, T1.LogTime )
    FROM 
        #TEMP AS T1
        LEFT JOIN #TEMP AS T2
            ON 1 = 1
            AND T1.LogIndex = T2.LogIndex + 1
            AND T1.UserID = T2.UserID
)
, "ROLSUM" AS
(
    SELECT
        *
        , sumDiff = ( SELECT SUM(diff) FROM "CTE" AS C2 WHERE C2.LogIndex <= C1.LogIndex AND C2.UserId = C1.UserId )
    FROM
        "CTE" AS C1
)
SELECT 
    LogIndex, UserID, LogTime
FROM 
    ROLSUM
WHERE
    sumDiff > 2000 OR sumDiff IS NULL

このクエリはヒントにすぎないことに注意してください。userIDデモデータで動作しますが、有効なデータと無効なデータの前の間隔の後に拒否する必要があるデータの別の束を追加するごとにさらにデータを追加すると失敗します。

私は最初の変種を好みます。必要なものをより早く簡単に入手できるのに、なぜデータを保存して後で処理する必要があるのでしょうか?!

于 2013-02-25T12:37:21.843 に答える