РЕДАКТИРОВАТЬ: ах, стрелять, я только что заметил тег SQL2K. Пример 1 все еще должен работать, но пример 2 не будет. Хм, как мы можем исправить это .....?
РЕДАКТИРОВАТЬ: исправлено!
РЕДАКТИРОВАТЬ: даже лучше!
Если вы проанализировали текстовое поле, этот запрос даст вам любое удаление, которому предшествовал как минимум 2 удаления одного и того же пользователя в 15-минутном окне:
SELECT UserName, LogDate
FROM #parsed_data a
WHERE EXISTS (
SELECT * FROM #parsed_data b
WHERE a.UserName = b.UserName
AND b.LogDate < a.LogDate
AND DATEDIFF(MINUTE,b.LogDate,a.LogDate) <= 15
HAVING COUNT(*) >= 2
)
(у вас должен быть индекс (UserName LogDate), кстати)
Что касается только удаления удаленных на 20 секунд или более, это не так просто. Может быть, что-то подобное?
SQL2K, на основе this от Quassnoi:
SELECT a.UserName, a.LogDate, b.LogDate, c.LogDate --, etc
FROM #parsed_data a
JOIN #parsed_data b
ON b.RecordId = (
SELECT TOP 1 b0.RecordId FROM #parsed_data b0
WHERE b0.UserName = a.UserName AND b0.LogDate < a.LogDate1
AND DATEDIFF(MINUTE,b0.LogDate,a.LogDate) <= 15
AND DATEDIFF(SECOND,b0.LogDate,a.LogDate) >= 20
ORDER BY b0.LogDate DESC
)
JOIN #parsed_data c
ON c.RecordId = (
SELECT TOP 1 c0.RecordId FROM #parsed_data c0
WHERE c0.UserName = b.UserName AND c0.LogDate < b.LogDate
AND DATEDIFF(MINUTE,c0.LogDate,a.LogDate) <= 15
AND DATEDIFF(SECOND,c0.LogDate,b.LogDate) >= 20
ORDER BY c0.LogDate DESC
)
SQL2005 / 2008, CROSS APPLY:
SELECT a.UserName
, a.LogDate AS LogDate0 -- current
, b.LogDate AS LogDate1 -- prior
, c.LogDate as LogDate2 -- prior prior
FROM #parsed_data a
CROSS APPLY (
SELECT TOP 1 b.LogDate FROM #parsed_data b
WHERE b.UserName = a.UserName
AND b.LogDate < a.LogDate
AND DATEDIFF(MINUTE,b.LogDate,a.LogDate) <= 15
AND DATEDIFF(SECOND,b.LogDate,a.LogDate) >= 20
ORDER BY b.LogDate DESC
) b
CROSS APPLY (
SELECT TOP 1 c.LogDate FROM #parsed_data c
WHERE c.UserName = a.UserName
AND c.LogDate < b.LogDate
AND DATEDIFF(MINUTE,c.LogDate,a.LogDate) <= 15
AND DATEDIFF(SECOND,c.LogDate,b.LogDate) >= 20
ORDER BY c.LogDate DESC
) c
В CROSS APPLY я использовал TOP 1 LogDate...ORDER BY LogDate DESC
вместо MAX(LogDate)
, чтобы вы могли добавить другие поля в набор результатов, например RecordId, Workstation и т. Д.