- Вам может не понадобиться ABS
- 5-минутный DATEDIFF охватывает диапазон от 4 минут и от 0,003 секунд до 5 минут и 59,997 секунд из-за того, как выполняются границы (ноль секунд)
- COUNT (DISTINCT SegmentDT) должен удалять случаи, когда у вас есть несколько вызовов в 300-секундном окне
Итак:
SELECT
WhoCalled, COUNT(DISTINCT SegmentDT)
FROM
MyTable a
INNER JOIN
MyTable b ON a.WhoCalled = b.WhoCalled
WHERE
ABS(DateDiff(second, a.SegmentDT, b.SegmentDT)) <= 300
Другая формулировка заключается в использовании оконной функции. Это сравнит соседние строки:
;WITH CTE AS
(
SELECT
WhoCalled,
ROW_NUMBER() OVER (ORDER BY SegmentDT) AS RowNum
FROM
MyTable
)
SELECT
WhoCalled, COUNT(*)
FROM
CTE a
INNER JOIN
CTE b ON a.WhoCalled = b.WhoCalled AND a.RowNum + 1 = b.RowNum
WHERE
DateDiff(second, a.SegmentDT, b.SegmentDT) <= 300