0

Lead/Lag 関数を正しくインクリメント/デクリメントして正しい値を返すことができません。何をしても、現在の行が返されます。p.field3 値 = '223344' の場合、前の p.field2 値と後続の p.field2 値を表示する必要があります。

BEGIN TRY
    SELECT p.field1, 
           p.field2,
           LEAD( p.field2, 1, 'No Lead') OVER (ORDER BY p.field1) AS 'Lead',
           LAG(  p.field2, 1, 'No Lag' ) OVER (ORDER BY p.field1) AS 'Lag',
           p.field3,
           p.field4
    FROM fieldTable p
    WHERE p.field3 = '223344' 
    ORDER BY p.field1
END TRY
BEGIN CATCH
.....
END CATCH

Example Data in Database
1, 'Mr. Smith', '112233', 'Info1'
2, 'Mr. Jones', '223344', 'Info2'
3, 'Mr. Davis', '334455', 'Info3'

Data Being Returned for both Lag and Lead
2, 'Mr. Jones', 'Mr. Jones', 'Mr. Jones', '223344', 'Info2'

I need 'Mr. Smith' to be returned for Lag and 'Mr. Davis' returned for Lead
4

1 に答える 1

2

あなたのクエリは、あなたが言うことを出力しません。表示しているよりも多くのサンプル データがテーブルに含まれている必要があります。

テーブルにこのデータを使用すると、次のようになります。

field1      field2      field3  field4
1           Mr. Smith   112233  Info1
2           Mr. Jones   223344  Info2
3           Mr. Davis   334455  Info3

これはクエリの出力です。

field1  field2      Lead    Lag         field3  field4
2       Mr. Jones   No Lead No Lag      223344  Info2

これは予想どおりです。WHERE 条件でセットを制限し、ベース テーブルから 1 行のみを選択しています。したがって、LAG または LEAD 行はなく、どちらも指定されたデフォルト値を返します。

実際のサンプル テーブルには、field3 = '223344' の行がいくつかあると思いますが、field2 の値はすべて同じですか?

FULL セットでウィンドウ関数を使用し、後でクエリを制限する必要があります。これは、サブクエリで実行できます。この場合、共通のテーブル式を使用しました。これは、読みやすく、テストしやすいと思います。

WITH
    BaseQuery AS (
        SELECT p.field1, 
                p.field2,
                LEAD( p.field2, 1, 'No Lead') OVER (ORDER BY p.field1) AS 'Lead',
                LAG(  p.field2, 1, 'No Lag' ) OVER (ORDER BY p.field1) AS 'Lag',
                p.field3,
                p.field4
        FROM fieldTable p
    )

SELECT
    *
FROM
    BaseQuery
WHERE
    field3 = '223344'

これにより、目的の出力が生成されます。

field1  field2      Lead        Lag         field3  field4
2       Mr. Jones   Mr. Davis   Mr. Smith   223344  Info2
于 2016-03-18T21:43:59.557 に答える