2013-03-08 1 views
2

J'essaie d'utiliser la fonction over pour compter le nombre d'événements qui commencent entre la date de début et la date de fin de la ligne courante pour toutes les lignes. C'est à dire. un compteur concurrent. Finalement, je chercherai à trouver le maximum d'événements simultanés par jour ou par heure, etc.SQL - OVER Clause comprise entre 2 fois

select FingerPrint 
     ,StartDate 
     ,EndDate 
     ,Num_ConCurrent = count(FingerPrint) over (
                partition by StartDate 
                order by StartDate 
                range between StartDate PRECEDING and EndDate following 
     ) 
from #File 
group by  FingerPrint 
      ,StartDate 
      ,Enddate 

Malheureusement, cela ne semble pas fonctionner. Alors que je sais que je pourrais simplement utiliser une auto-jointure, je pensais qu'il pourrait y avoir une méthode alternative avec la clause over.

Toute aide très appréciée.

NB: Message d'erreur

Msg 102, niveau 15, état 1, ligne 7 syntaxe incorrecte près de 'StartDate'.

+2

Veuillez marquer la version de SQL Server. –

Répondre

0

Le paramètre Range de la clause over recherche une valeur entière, pas une référence de colonne. Il y a peut-être un moyen de le faire avec une clause over, mais je ne pouvais pas le faire fonctionner non plus. Dans mon expérience, l'auto-jonction de dates dans une plage est super lent et je n'ai pas trouvé le bon ensemble d'index pour l'accélérer. Dans ce cas, je voudrais juste utiliser dans la sous-requête en ligne.

select FingerPrint, 
     StartDate, 
     EndDate, 
     (select count(FingerPrint) 
     from #File F2 
     where F2.StartDate between F.StartDate and F.EndDate 
     ) 
     as Num_ConCurrent 
     ) 
from #File F 

couru quelques tests sur certaines données de rendez-vous que j'ai et 32.000 lignes de rendez-vous instantanément en utilisant exécute cette méthode. L'auto-jointure a duré 15 secondes avant que je l'arrête.

Questions connexes