2010-12-06 7 views
0

Merci à tous ceux qui peuvent vous aider. J'utilise MSSQL 2005SQL simple datetime count occurrences requête me rend fou!

J'ai une base de données comme si

SegmentDT DateTime, 
WhoCalled varchar(4) 

Tout ce que je veux faire est de trouver tous les Appels manqués qui ont un nombre d'appels à 5 minutes de l'autre.

Comment puis-je accomplir ceci?

+1

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

Répondre

0
SELECT WhoCalled, count(*) 
FROM tbl a 
INNER JOIN tbl b ON a.WhoCalled = b.WhoCalled 
AND DateDiff(n, a.SegmentDT, b.SegmentDT) > 0 
AND DateDiff(n, a.SegmentDT, b.SegmentDT) <= 5 
1
  • 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