2016-06-02 4 views
-1

У меня есть временной ряд, и мне нужно создать подмножества временных интервалов, которые не имеют больших зазоров (что-то большое, чем 30 минут - большой пробел). Это SQL 2008, поэтому я не могу использовать функции Lead()/Lag().Пропуски SKIP более 30 минут в столбце временной отметки

Каждый раз, когда есть промежуток не менее 30 минут, мне нужен новый ряд с началом и концом следующего «большого безразмерного» интервала. Например, если больших зазоров нет, результатом будет одна строка с min и max временных меток. Если есть 1 'большой' промежуток, будет 2 строки - от начала серии до промежутка и от промежутка до конца. Если есть еще пробелы, мы получаем строки для каждого интервала между зазорами и т.д.

Вход: timestamp

2015-07-15 15:01:21 
2015-07-15 15:17:44 
2015-07-15 15:17:53 
2015-07-15 15:18:34 
2015-07-15 15:21:41 
2015-07-15 15:58:12 
2015-07-15 15:59:12 
2015-07-15 16:05:12 
2015-07-15 17:02:12 

Желаемый результат:

 from   |  to 
--------------------+------------------- 
2015-07-15 15:01:21 | 2015-07-15 15:21:41 
2015-07-15 15:58:12 | 2015-07-15 16:05:12 
2015-07-15 17:02:12 | 2015-07-15 17:02:12 

Спасибо так много - я работаю на это в течение нескольких дней без везения, и мое решение курсора слишком медленное.

+3

Dont дублировать свои вопросы http://stackoverflow.com/questions/37579492/detect-gaps-over-30-min -in-timestamp-column –

+0

Кстати вы можете прочитать [** ЭТО **] (http://blog.sqlauthority.com/2011/11/24/sql-server-solution-to-puzzle-simulate-lead-and -lag-without-using-sql-server-2012-аналитическая функция /), чтобы узнать дублирующее отставание/вывод в 2008 году –

ответ

0

здесь приведен пример использования row_number в качестве удобной замены свинца и лаг

;WITH CTE AS (SELECT *, row_number() OVER(order by LogTime) rown from isproclog) 
select logtime from cte WHERE NOT EXISTS 
      (SELECT 0 FROM cte cte2 
         WHERE 
          CTE2.LogTime < CTE.LogTime 
          AND 
          CTE2.LogTime >= DATEADD("mi",-30, CTE.LogTime) 
      ) 
UNION SELECT MIN(LogTime) FROM CTE 
UNION SELECT MAX(LogTime) FROM CTE ORDER BY LogTime 
+0

Фактически я никогда не использовал row_number из CTE, а UNION SELECT MIN (LogTime) FROM CTE является дополнительным для требования, так как он не имеет предшествующей строки, но требуется MAX – Cato

+0

выберите время регистрации из isprocl OG КТР ГДЕ НЕ СУЩЕСТВУЕТ \t \t \t \t (SELECT 0 от isproclog cte2 \t \t \t \t \t \t \t ГДЕ \t \t \t \t \t \t \t \t CTE2.LogTime = DATEADD ("ми", - 30, CTE.LogTime) \t \t \t \t) \t СОЕДИНЕНИЕ SELECT MAX (LogTime) ОТ isProcLog ORDER BY LogTime – Cato

+0

Спасибо Энди. Я проверю его и дам знать :) – user3431083

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