Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Raggruppa DateTime in intervalli di 5,15,30 e 60 minuti

Usando

datediff(minute, '1990-01-01T00:00:00', yourDatetime)

ti darà il numero di minuti trascorsi da 1990-1-1 (puoi utilizzare la data di base desiderata).

Quindi puoi dividere per 5, 15, 30 o 60 e raggruppare per il risultato di questa divisione. Ho verificato che verrà valutato come una divisione intera, quindi otterrai un numero intero che puoi utilizzare per raggruppare.

cioè

group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5

AGGIORNAMENTO Poiché la domanda originale è stata modificata per richiedere che i dati vengano mostrati in formato data-ora dopo il raggruppamento, ho aggiunto questa semplice query che farà ciò che vuole l'OP:

-- This convert the period to date-time format
SELECT 
    -- note the 5, the "minute", and the starting point to convert the 
    -- period back to original time
    DATEADD(minute, AP.FiveMinutesPeriod * 5, '2010-01-01T00:00:00') AS Period,
    AP.AvgValue
FROM
    -- this groups by the period and gets the average
    (SELECT
        P.FiveMinutesPeriod,
        AVG(P.Value) AS AvgValue
    FROM
        -- This calculates the period (five minutes in this instance)
        (SELECT 
            -- note the division by 5 and the "minute" to build the 5 minute periods
            -- the '2010-01-01T00:00:00' is the starting point for the periods
            datediff(minute, '2010-01-01T00:00:00', T.Time)/5 AS FiveMinutesPeriod,
            T.Value
        FROM Test T) AS P
    GROUP BY P.FiveMinutesPeriod) AP

NOTA:l'ho diviso in 3 sottoquery per chiarezza. Dovresti leggerlo dall'interno. Ovviamente potrebbe essere scritta come una query singola e compatta

NOTA:se modifichi il periodo e la data-ora di inizio puoi ottenere qualsiasi intervallo di cui hai bisogno, come settimane a partire da un determinato giorno, o qualsiasi cosa tu possa aver bisogno

Se vuoi generare dati di test per questa query usa questo:

CREATE TABLE Test
( Id INT IDENTITY PRIMARY KEY,
Time DATETIME,
Value FLOAT)

INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:00:22', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:03:22', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:04:45', 10)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:07:21', 20)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:10:25', 30)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:11:22', 30)
INSERT INTO Test(Time, Value) VALUES('2012-03-22T00:14:47', 30)

Il risultato dell'esecuzione della query è questo:

Period                     AvgValue
2012-03-22 00:00:00.000    10
2012-03-22 00:05:00.000    20
2012-03-22 00:10:00.000    30