- Vous ne pouvez pas besoin de l'ABS
- A DATEDIFF 5 minutes couvre la plage 4 minutes et 0,003 secondes à 5 minutes et 59.997 secondes en raison de la façon dont les limites sont faites (zéro seconde)
- COUNT (DISTINCT SegmentDT) devrait supprimer occurences où vous avez plusieurs appels dans 300 deuxième fenêtre
Alors:
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
Une autre formulation consiste à utiliser une fonction de fenêtre. Cela permettra de comparer les lignes adjacentes:
;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
pouvez-vous ajouter un exemple avec la sortie? si vous aviez 3 lignes, toutes avec whocalled = 'beth' et les valeurs segmentDT 1/1/2010 12:00, 1/1/2010 12:01, 1/1/2010 12:02, quels résultats attendriez-vous? – Beth