Gruppieren Sie den Tisch in 15-Minuten-Intervallen

T-SQL, SQL Server 2008 und höher

Angesichts einer Beispieltabelle von

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

Ich muss das in eine Ansicht zerlegen, die 15-Minuten-Intervalle verwendet, zum Beispiel:

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....

Jetzt konnte ich mich umschauen und einige Abfragen finden, die zusammenbrechen werden. Ich habe etwas Ähnliches für MySql gefundenHier :

Und etwas für T-SQLHier

Aber im zweiten Beispiel werden die Ergebnisse summiert, während ich die Gesamtdauer durch die Intervallzeit (900 Sekunden) nach Benutzer und Status teilen muss.

Ich konnte die Beispiele im zweiten Link anpassen, um alles in Intervalle aufzuteilen, aber die Gesamtdauer wird zurückgegeben, und ich kann nicht genau herausfinden, wie die aufzuteilenden Intervalldauern ermittelt werden (und trotzdem die Gesamtursprungsdauer addieren).

Vielen Dank im Voraus für jeden Einblick!

edit: Erster Versuch

 ;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: Zweiter Versuch

;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;

Antworten auf die Frage(5)

Ihre Antwort auf die Frage