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;