0

我有一个表Actions,架构打击:

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

现在我想检索最新的记录,但是很可能该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/15,Status: '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 

..然后多个 SELECT TOP 1 子查询仍然是我认为的最佳选择..

但如果它像场景 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 回答