0

私はテーブルを持っていますActions、スキーマブロー:

[Actions]
ActionID
Date
Status <--Nullable, a delta column, only stores value when status changes

ここで、最新のレコードを取得したいのですが、そのレコードがnullである可能性が非常に高いStutusため、最後のステータス変更(ランク付けDate)を取得したいと思います。

次に例を示します。

ActionID | Date | Status
------------------------
1        | 04/12| 'Bon'
2        | 04/13| NULL
3        | 04/14| NULL
4        | 04/15| NULL

私の最新のレコードは次のようになります:ActionID: 4、、Date: 04/15Status: 'Bon'

ネストされたselectステートメントを使用することは可能ですが、実際のテーブルにはこれらの列が約10個あり、このようなクエリが多数行われると、パフォーマンスに大きな影響を与えます。もっと簡単な方法があるのだろうか?

4

2 に答える 2

0

私があなたのルールを理解したかどうかはわかりませんが、これを試してください:

SELECT TOP 1
ActionID,
Date,
(SELECT TOP 1 Status FROM Actions WHERE Status IS NOT NULL ORDER BY ActionID DESC) AS Status
FROM Actions
ORDER BY ActionID DESC

あなたはあなたが10列を持っていると言いました..それはどのように機能しますか?

シナリオAのように)

 ActionID | Date  | StatusA | StatusB | StatusC
        1 | 04/11 | DELTA_A | NULL    | DELTA_C
        2 | 04/12 | NULL    | DELTA_B | DELTA_C
        3 | 04/13 | DELTA_A | NULL    | NULL 

..それでも、複数のSELECTTOP1サブクエリが最適だと思います。

しかし、それがシナリオBのような場合)

 ActionID | Date  | StatusA | StatusB | StatusC
        1 | 04/11 | NULL    | NULL    | NULL
        2 | 04/12 | DELTA_A | DELTA_B | DELTA_C
        3 | 04/13 | NULL    | NULL    | NULL 

..次に、次のようにクエリを「逆」にすることができます。

SELECT TOP 1
(SELECT TOP 1 ActionID FROM Actions WHERE Status IS NOT NULL ORDER BY ActionID DESC) AS ActionID,
(SELECT TOP 1 Date FROM Actions WHERE Status IS NOT NULL ORDER BY ActionID DESC) AS Date,
StatusA,
StatusB,
StatusC
FROM Actions
WHERE StatusA IS NOT NULL -- then StatusB and StatusC are also NOT NULL
ORDER BY ActionID DESC

..ただし、StatusA = NOT NULLの行がない場合は、空の結果が得られる可能性があることに注意してください。

于 2012-04-13T23:29:03.750 に答える
0

たぶんこれはあなたを助けますが、私はあなたの要件を理解したかどうかはわかりません:

WITH Actions AS(
   SELECT ROW_NUMBER()OVER(Order By Date DESC)AS DateRank
        , ActionsID
        , Date
        , Status
    FROM [Actions]
)
SELECT TOP 1 a1.ActionsID,a1.Date,a2.Status 
FROM Actions a1 INNER JOIN Actions a2 
    ON a1.DateRank < a2.DateRank AND a2.Status IS NOT NULL
WHERE a1.DateRank=1
于 2012-04-13T23:41:43.853 に答える