2016-09-20 4 views
0

特定のイベントを追跡しようとしていますが、前の5行もリストしたいと思います。前の行が5行あるSQLイベントログを選択してください

私はこの方法ですべてのイベントを一覧表示することができます。

select * 
from Payment 
where PaymentCardNumber like '%MyEvent%' 

が、私はまた、私は、主キーの検索クエリを作成したい5以前の行リストするよう:

select * 
from Payment 
where PrimaryKey between (select PrimaryKey -5 
          from TablePayment 
          where PaymentCardNumber like '%MyEvent%') 
        and (select PrimaryKey 
          from TablePayment 
          where PaymentCardNumber like '%MyEvent%') 

もちろん、2つの数字を与える代わりに、数字のリストをSQLに渡しているので、これは機能しません。

それでは、どのようにすべてのイベントの5つの以前の行を問い合わせることができ機能またはループを整理するには?

+0

複数のイベントが 'WHERE'条件に一致するとどうなりますか? –

答えて

0
select TOP 5 * 
from Payment 
WHERE PaymentCardNumber like '%MyEvent%' 
ORDER BY 
    PrimaryKey DESC 

あなたはSELECT TOPを使用すると、ソートあなたの場所の文に一致する5つの最新のイベントを取得するが、ゴードンが適切に指摘するように、あなたはまた、1つの以上のイベントを取得する可能性があります降順ことができます。

WITH e AS (
     SELECT PrimaryKey 
     FROM Payment 
     WHERE PaymentCardNumber like '%MyEvent%' 
    ) 
SELECT e.PrimaryKey as comparisonPK, p.* 
FROM e OUTER APPLY 
    (SELECT TOP 5 p.* 
     FROM p 
     WHERE p.PrimaryKey < e.PrimaryKey 
     ORDER BY p.PrimaryKey DESC 
    ) p 
UNION ALL 
SELECT e.PrimaryKey as comparisonPK, p.* 
FROM e OUTER APPLY 
    (SELECT TOP 5 p.* 
     FROM p 
     WHERE p.PrimaryKey > e.PrimaryKey 
     ORDER BY p.PrimaryKey ASC 
    ) p 
ORDER BY comparisonPK, PrimaryKey; 

CTEは、プライマリを取得する:あなたがあなたの基準を満たすイベントごとに5つの最新のレコードをしたい場合はここではSQL-Server 2008の

;WITH cte AS (
    select * 
     ,ROW_NUMBER() OVER (PARTITION BY PaymentCardNumber ORDER BY PrimaryKey DESC) as RowNumber 
    from Payment 
    WHERE PaymentCardNumber like '%MyEvent%' 
) 

SELECT * 
FROM 
    cte 
WHERE 
    RowNumber <= 5 
0

が一つの方法ですので、私は可能なROW_NUMBER()関数を使用しますあなたが気にするイベントの鍵。 OUTER APPLYは、その行の前後に5行を選択します。

関連する問題