MS SQL返回N的最后一个实例后的所有行

问题描述:

我有一个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开头,但步骤数可能会有所不同。数字或重复也可以根本不改变任何次数。

任何帮助,将不胜感激。

感谢

的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

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

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

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

这似乎返回所有步骤,他们上次运行。我想返回的是最后一个1,2,3等等。所以我试图找到第一步的最后一个实例,然后只返回那个步骤和其他任何东西,之前没有任何东西。如果第一次跑到第5步,但最后一次跑到第3步,我不关心4和5,就是最后一次跑的1,2,3。 – APB

+1

无论如何,在相对较小的数据集之后,在执行计划被废除之后,我预计会更好。规范化。 – WickedFan