2016-04-28 106 views
0

我有一個MS SQL查詢返回計算機執行的步驟列表。它具有按每個步驟執行時間排序的步驟編號。我的問題是,有時這些步驟會重複,但我只想返回步驟1-> n的最後一個序列。所以我想用第一步取最後一行,並且只返回那一行以及之後的任何內容。MS SQL返回N的最後一個實例後的所有行

SELECT Time,Step FROM Table1 
WHERE Computer = 'ComputerName' 
AND Step IS NOT NULL 
ORDER BY Time 

信息返回...

Time Step 
00:01 1 
00:02 2 
00:03 3 
00:04 1 
00:05 2 
00:06 3 
00:07 4 

我想忽略的步驟1的最後一個序列之前,一切> n和只返回...

Time Step 
00:04 1 
00:05 2 
00:06 3 
00:07 4 

步驟將始終以1開頭,但步驟數可能會有所不同。數字或重複也可以根本不改變任何次數。

任何幫助,將不勝感激。

感謝

回答

2

的MAX(時間)給了我一個想法,我相信我想通了。我只需要在執行最後一步之後使用WHERE語句來獲取所有內容。

SELECT Time,Step FROM Table1 
WHERE Computer = 'Computer1' 
AND Step IS NOT NULL 
AND TIME >= (SELECT MAX(Time) FROM Table1 WHERE Computer = 'Computer1' AND Step = 1) 
ORDER BY Time 
+0

這個對我來說也是最有意義的。 –

+0

這一個不符合你原來的問題。如果第3步出現在第2步之前,則不顯示第3步。 – WickedFan

+0

什麼會導致第3步不顯示?這應該返回在最近的步驟1之後發生的任何事情。 – APB

-1
SELECT distinct t2.time, t1.step 
FROM Table1 t1 
JOIN (Select MAX(time) time, step 
     FROM table1 
     GROUP BY step) as t2 ON t2.step = t1.step 
ORDER BY step 

ExecutionPlan

+0

子查詢和聯接是過度殺傷 - 這個小表很好,但是任何大量的步驟都會比沒有它的簡單GROUP BY和MAX指數級更長。 – AutomationNation

+0

我可能會讓我的思維複雜化。但是由於問題中提到的限制,我認爲這種思路是必要的;步驟可以重新啓動,只需要最後一次出現。感謝downvote! ;) – WickedFan

1

你不需要的子查詢和加入 -

SELECT MAX(Time), Step 
FROM Table 
GROUP BY Step 
+0

這似乎返回所有步驟,他們上次運行。我想返回的是最後一個1,2,3等等。所以我試圖找到第一步的最後一個實例,然後只返回那個步驟和其他任何東西,之前沒有任何東西。如果第一次跑到第5步,但最後一次跑到第3步,我不關心4和5,就是最後一次跑的1,2,3。 – APB

+1

無論如何,在相對較小的數據集之後,在執行計劃被廢除之後,我預計會更好。規範化。 – WickedFan

相關問題