У нас есть таблица захвата событий, которая содержит различные типы событий (на основе EventTypeId) для нескольких активов (на основе assetId).
В нашем коде была ошибка приложения, которую мы недавно исправили где время окончания записывалось неправильно. И время окончания фиксируется, когда изменяется «Серьезность» для данного типа события и ресурса. Но это было сделано неправильно.
Я попытался выполнить приведенный ниже запрос, чтобы получить время начала и окончания, но из-за повторяющихся дубликатов я не могу получить правильные данные.
The SQL, который я в настоящее время сформулировал (взято из: Рассчитать время между строками состояния включения и выключения SQL Сервер )
WITH ReportData
AS (SELECT e.Id [EventId]
,e.AssetId
,e.StartTime
,e.Severity
,e.EventTypeId
,a.Name [AssetName]
,ROW_NUMBER() OVER (PARTITION BY e.AssetId ORDER BY e.StartTime) RowNum
,ROW_NUMBER() OVER (PARTITION BY e.AssetId ORDER BY e.StartTime)
- ROW_NUMBER() OVER (PARTITION BY e.AssetId, e.Severity ORDER BY e.StartTime) AS [Group]
FROM dbo.Event e
JOIN dbo.Asset a
ON a.Id = e.AssetId)
SELECT state1.AssetName
,state1.AssetId
,MIN(state1.StartTime) [START]
,MAX(state2.StartTime) [END]
,DATEDIFF(SS, MIN(state1.StartTime), MAX(state2.StartTime)) [Duration]
,state1.Severity
,state1.EventId
FROM ReportData state1
LEFT JOIN ReportData state2
ON state1.RowNum = state2.RowNum - 1
WHERE state1.Severity = 'Extreme'
AND state2.StartTime IS NOT NULL
AND state1.EventTypeId = 27
GROUP BY state1.AssetName
,state1.AssetId
,state1.Severity
,state1.EventId
,state1.[Group]
ORDER BY MIN(state1.StartTime) DESC;
Дубликаты выглядят примерно так
Может ли кто-нибудь подсказать мне время начала и окончания на основе изменения статуса (тип события и изменение актива для серьезности), игнорируя дубликаты.
Также, если бы вы могли дать мне запрос, чтобы определить дубликаты, чтобы мы могли удалить его, было бы здорово!