2012-04-13 93 views
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: 4Date: 04/15Status: 'Bon'

我知道這是可能的嵌套的SELECT語句的事情,但是在我的真表,我有大約10個這樣的列,當這樣的許多查詢產生時,它會嚴重影響性能。我想知道是否有更簡單的方法來做到這一點?

+0

動作看起來像只追加表。如果這是真的,附加表'LastAction'和一個簡單的觸發器更新表,最新的ID和非空列可能是有益的。 – 2012-04-13 23:24:22

+0

ActionID = 4的記錄與Status ='Bon'的記錄有什麼關係? – 2012-04-13 23:26:06

+0

基本上我想檢索這個表中的最後一條記錄,它是'ActionID = 4',但它的狀態是* NULL *,所以它需要用''Bon''填充* NULL *,因爲這是最後一個非 - 狀態記錄爲空。 – Bonk 2012-04-13 23:35:54

回答

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 

..then多個SELECT TOP 1的子查詢依然是我認爲最的choise ..

,但如果它像場景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的行,您可能會得到空結果。

+0

謝謝,這是我目前的解決方案。但我希望避免太多嵌套的select語句。因爲我有大約10個這樣的列,它們是相互排斥的。 – Bonk 2012-04-13 23:40:15

+0

我已經擴展了我上面的示例查詢。現在看看它們。 – huhu78 2012-04-14 12:22:42

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 
+0

請注意,TOP子句是多餘的,因爲我只選擇最後一個記錄('a1.DateRank = 1')。 – 2012-04-14 00:04:39