1

私はよく SQLServer のログを確認しますが、クエリは通常次のようになります (Type = 0 はエラーを意味します)。

SELECT * 
FROM Logs 
WHERE Type = 0 
ORDER BY Timestamp

しかし、ほとんどの場合、私はエラー自体だけでなく、エラーの直前に何が起こったかにも関心があります。

SQLServer を使用して、クエリの WHERE 句に一致する各行 (主キーに対して) の上/下の n 行をクエリすることは可能ですか?

元。私のクエリでは、125 行と 130 行しか取得できません。[123, 124, 125] と [128, 129, 130] が必要です。

PrimaryKey  Timestamp             Type  Description
123         2012-09-17 03:41:46.240 1   Working.
124         2012-09-17 03:42:46.240 1   Database backup.
125         2012-09-17 03:43:46.240 0   Access violation.
126         2012-09-17 03:44:46.240 1   Working.
127         2012-09-17 03:45:46.240 1   Working.
128         2012-09-17 03:46:46.240 1   Working.
129         2012-09-17 03:47:46.240 1   Backup.
130         2012-09-17 03:48:46.240 0   Corrupted.
131         2012-09-17 03:49:46.240 1   Working.

ありがとうございました。

4

1 に答える 1

2

私は次のようにします:

SELECT 
    L2.* 
FROM 
    Logs L1
    JOIN Logs L2
    ON 
        L1.PrimaryKey = L2.PrimaryKey OR 
        L1.PrimaryKey = L2.PrimaryKey - 1 OR
        L1.PrimaryKey = L2.PrimaryKey + 1
WHERE
    L1.Type = 0

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

PrimaryKey  TS                      Type        Description
----------- ----------------------- ----------- -----------------
124         2012-09-17 03:42:46.240 1           Database backup.
125         2012-09-17 03:43:46.240 0           Access violation.
126         2012-09-17 03:44:46.240 1           Working.
129         2012-09-17 03:47:46.240 1           Backup.
130         2012-09-17 03:48:46.240 0           Corrupted.
131         2012-09-17 03:49:46.240 1           Working.

n関係演算子を使用して結合条件を変更し、一致する行の上下の行を取得できます。

TimestampPrimaryKey 列がシーケンシャルであることが保証されていない場合、レコードが常に順番どおりに並べられていると仮定ASCすると、次のクエリは前後のレコードを選択したレコードにフェッチします。

WITH LogsTable (PrimaryKey, TS, Type, Description, Rank) AS
(
    SELECT 
        PrimaryKey, 
        TS, 
        Type, 
        Description, 
        ROW_NUMBER() OVER (ORDER BY TS ASC) as 'Rank' 
    FROM 
        Logs
)
SELECT 
    L2.* 
FROM 
    LogsTable L1
    JOIN LogsTable L2
    ON 
        L1.Rank = L2.Rank OR 
        L1.Rank = L2.Rank - 1 OR
        L1.Rank = L2.Rank + 1
WHERE
    L1.Type = 0
于 2012-09-21T18:10:57.623 に答える