Table de groupe dans les intervalles de 15 minutes

T-SQL, SQL Server 2008 et jusqu'

Donné un exemple de table de

 StatusSetDateTime   | UserID | Status    | StatusEndDateTime   | StatusDuration(in seconds)
============================================================================
 2012-01-01 12:00:00 | myID   | Available | 2012-01-01 13:00:00 | 3600

J'ai besoin de casser cela dans une vue qui utilise les intervalles de 15 minutes par exemple:

IntervalStart       | UserID | Status | Duration

===========================================

2012-01-01 12:00:00 | myID | Available | 900 

2012-01-01 12:15:00 | myID | Available | 900

2012-01-01 12:30:00 | myID | Available | 900 

2012-01-01 12:45:00 | myID | Available | 900 

2012-01-01 13:00:00 | myID | Available | 0

etc....

Maintenant, j'ai été en mesure de rechercher et de trouver quelques requêtes qui va briser
J'ai trouvé quelque chose de similaire pour MySql Ici :

Et quelque chose pour T-SQL Ici

Mais sur le deuxième exemple, ils sont en additionnant les résultats alors que j'ai besoin de diviser le total de la durée de l'intervalle de temps (900 secondes) par l'utilisateur par l'état.

J'ai été en mesure d'adapter les exemples dans le deuxième lien à couper le tout en intervalles, mais la durée totale est retourné et je ne peux pas comprendre comment faire pour obtenir l'Intervalle de périodes split (et encore la somme du total de la durée d'origine).

Merci d'avance pour toute perspicacité!

edit : Première Tentative

 ;with cte as 
    (select MIN(StatusDateTime) as MinDate
          , MAX(StatusDateTime) as MaxDate
          , convert(varchar(14),StatusDateTime, 120) as StartDate
          , DATEPART(minute, StatusDateTime) /15 as GroupID
          , UserID
          , StatusKey
          , avg(StateDuration) as AvgAmount
     from AgentActivityLog
     group by convert(varchar(14),StatusDateTime, 120)
         , DATEPART(minute, StatusDateTime) /15
         , Userid,StatusKey)

  select dateadd(minute, 15*GroupID, CONVERT(datetime,StartDate+'00'))
         as [Start Date]
       , UserID, StatusKey, AvgAmount as [Average Amount]
  from cte

edit : Deuxième Tentative

;With cte As
   (Select DateAdd(minute
                   , 15 * (DateDiff(minute, '20000101', StatusDateTime) / 15)
                   , '20000101') As StatusDateTime
         , userid, statuskey, StateDuration
    From AgentActivityLog)

 Select StatusDateTime, userid,statuskey,Avg(StateDuration)
 From cte
 Group By StatusDateTime,userid,statuskey;
Dans votre exemple, vous avez découpé en 5 lignes et 5 * 900 != 3600 ou ai-je raté quelque chose?
Est-ce que votre premier intervalle de toujours commencer à l'heure de la StatusSetDateTime, ou est-il toujours en fonction :00, :15, :30, :45? À l'aide de votre exemple, si StatusSetDateTime est venu à 12:06:30, votre premier intervalle de commencer à 12;00:00 ou 12:06:30? Aussi, pouvez-vous poster le SQL vous avez jusqu'à présent pour le fractionnement?
Désolé je voulais mettre 0 dans la finale de l'intervalle de remercier pour la chasse. Les intervalles seront toujours 00, 15, 30, 45
Personnellement, StatusEndDateTime (vraiment?) est en exclusivité - le statut que vous avez à 13:00 est pas Available, c'est autre chose (inconnu), voire rien). Il serait, après tout, suggèrent que vous êtes disponible pour un supplément de 15 minutes, ce qui ne peut être effectivement le cas.
Désolé si je répète, il n'est pas clair: le StatusSetDatetime toujours fin :00, :15, h 30, ou :45? Sans aucune partie secondes? Et, êtes-vous SÛR d'inclure une ligne finale avec 0 durée? Quelle est la valeur ou de l'entreprise signifie un 0 durée de lignes?

OriginalL'auteur Wjdavis5 | 2012-11-30