SQL: обнаружение отсутствия повторяющегося журнала (каждые 30 секунд)

У нас есть задание SQL, которое выполняется каждые 30 секунд, где мы регистрируем каждый шаг (SQL Server 2012)

Иногда, без какой-либо причины и без какого-либо сообщения "сбой задания", задание останавливается и даже зависает (поведение, которое мы хотели бы проанализировать).

Чего мы хотели бы добиться - это запросить таблицу журналов и определить, когда запись отсутствует (не происходит каждые 30 секунд).

Например:

CREATION_DATE   MESSAGE
2015-09-17 07:49:38.053 11 : **Fin**
2015-09-17 07:49:02.377 11 : **Fin**
2015-09-17 07:48:32.100 11 : **Fin**
2015-09-17 07:48:01.940 11 : **Fin**
2015-09-17 07:47:32.100 11 : **Fin**
2015-09-17 07:47:01.967 11 : **Fin**
2015-09-17 07:46:31.663 11 : **Fin**
2015-09-17 07:46:01.803 11 : **Fin**
2015-09-17 07:45:31.663 11 : **Fin**
2015-09-17 07:45:02.060 11 : **Fin**
2015-09-17 07:44:31.843 11 : **Fin**
2015-09-17 07:44:01.970 11 : **Fin**
2015-09-17 07:43:22.397 11 : **Fin** <= MUST BE DETECTED (23 minutes between events)
2015-09-17 07:20:01.767 11 : **Fin** <= MUST BE DETECTED (3 minutes between events)
2015-09-17 07:17:01.743 11 : **Fin** 
2015-09-17 07:16:31.777 11 : **Fin**
2015-09-17 07:16:01.690 11 : **Fin**
2015-09-17 07:15:31.733 11 : **Fin**
2015-09-17 07:15:01.807 11 : **Fin**
2015-09-17 07:14:31.683 11 : **Fin**
2015-09-17 07:14:01.793 11 : **Fin**
2015-09-17 07:13:31.853 11 : **Fin**
2015-09-17 07:13:01.840 11 : **Fin**

Я надеюсь, что мой вопрос ясен.

3 ответа

Решение

Это показывает все периоды больше 30 секунд

select     A.CREATION_DATE as Start,  min(N.CREATION_DATE) as Finish
from       logTable  A
left join  logTable  N  on A.CREATION_DATE < N.CREATION_DATE
group by   A.CREATION_DATE
having     datediff(second, A.CREATION_DATE, min(N.CREATION_DATE)) > 30

Использование CTE делает это довольно легко.

with ordered_logs (creation_date, rnk) as
(
  select creation_date, row_number() over (order by creation_date)
  from your_log_table
)
select first.creation_date, second.creation_date, datediff(ss, first.creation_date, second.creation_date) as SecondsDifference
from ordered_logs first
inner join ordered_logs second on (first.rnk + 1) = second.rnk
where datediff(ss, first.creation_date, second.creation_date) > 30

Это упорядочивает все записи по дате их создания, а затем объединяет более раннюю запись со следующей (по времени). Затем он просто проверяет, превышает ли время создания более 30 секунд.

Это моё "грязное" решение, когда я пытаюсь заставить работать решение Луиса (выглядит лучше моего)

SELECT TOP 1000 [PROCEDURE_NAME]
      ,[CREATION_DATE]
      ,[MESSAGE]
      ,
       DATEDIFF(SECOND,
       (SELECT top 1 [CREATION_DATE] 
                    FROM [mactac].[mactac].[ERROR_LOG] f 
                    WHERE f.[CREATION_DATE]<c.[CREATION_DATE]
                    AND [PROCEDURE_NAME] like '%downl%' 
                    AND [MESSAGE]  LIKE '11 : **Fin**'
                      order by [CREATION_DATE] desc)
                    ,c.[CREATION_DATE]) as DIFF

  FROM [mactac].[mactac].[ERROR_LOG] as c
  WHERE [PROCEDURE_NAME] like '%downl%'
  AND [MESSAGE]  LIKE '11 : **Fin**'
  order by [CREATION_DATE] desc

Это решение отображает все записи и прошедшее время:-D Но.... Я еще не понял, как добавить:

И DIFF > 35

Invalid column name 'DIFF'.

Для того, чтобы отфильтровать более длительное время

Другие вопросы по тегам