2016-04-28 2 views
0

У меня есть запрос MS SQL, который возвращает список шагов, выполняемых компьютером. Он имеет номер шага, упорядоченный к тому времени, когда был выполнен каждый шаг. Моя проблема в том, что иногда шаги повторяются, но я хочу только вернуть последнюю последовательность шагов 1-> n. Поэтому я хотел бы взять последнюю строку с шагом 1 и только вернуть эту строку и что-нибудь после нее.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-> п и возвращать только ...

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

Шаги всегда будет начинаться с 1, но количество шагов может отличаться. Число или повторы могут также варьироваться от не к любому количеству раз.

Любая помощь будет оценена по достоинству.

Благодаря

ответ

2

МАХ (Time) дал мне идею, и я считаю, я понял это , Мне просто нужно использовать инструкцию WHERE, чтобы получить все после того, как был выполнен последний шаг 1.

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

У меня могло быть сложнее мое мышление. Но этот ход мысли, я считаю, необходим из-за ограничений, изложенных в вопросе; Шаги могут быть перезапущены и требуется только последнее вхождение. Спасибо за нижний уровень! ;) – WickedFan

1

Вам не нужно подзапрос и присоединиться -

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

Кажется, что все шаги вернулись и в последний раз. То, что я хотел бы вернуть, это последний 1,2,3 и т. Д. Итак, я пытаюсь найти последний экземпляр шага 1, а затем возвращу только этот шаг и что-нибудь после него, ничего перед ним. Если первый прогон перешел к шагу 5, но последний только дошел до шага 3, я не забочусь о 4 и 5, только последний прогон 1,2,3. – APB

+1

Я ожидал лучшего после того, как отказался от плана исполнения, который бы не имел значения после относительно небольшого набора данных в любом случае. Нормализация. – WickedFan

Смежные вопросы