Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Grupuj DateTime w odstępach 5,15,30 i 60 minut

Korzystanie

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

poda liczbę minut od 1990-1-1 (możesz użyć żądanej daty bazowej).

Następnie możesz podzielić przez 5, 15, 30 lub 60 i pogrupować według wyniku tego dzielenia. Sprawdzałem, czy zostanie to ocenione jako dzielenie całkowite, więc otrzymasz liczbę całkowitą, której możesz użyć do grupowania.

tj.

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

AKTUALIZUJ Ponieważ oryginalne pytanie zostało zredagowane, aby wymagać, aby dane były wyświetlane w formacie data-godzina po grupowaniu, dodałem to proste zapytanie, które zrobi to, czego chce 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

UWAGA:Dla jasności podzieliłem to na 3 podzapytania. Powinieneś przeczytać go od środka. Mogłoby oczywiście być napisane jako pojedyncze, zwięzłe zapytanie

UWAGA:jeśli zmienisz okres i początkową datę-godzinę, możesz uzyskać dowolny interwał, na przykład tygodnie zaczynające się od danego dnia lub cokolwiek, czego potrzebujesz

Jeśli chcesz wygenerować dane testowe dla tego zapytania, użyj tego:

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)

Wynik wykonania zapytania jest następujący:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego CTE jest lepsze niż kursor / tabela pochodna / podzapytania / tabela tymczasowa itp.?

  2. SQL Server — znajdź n-te wystąpienie w ciągu znaków

  3. SQL Server - sprzężenie wewnętrzne podczas aktualizacji

  4. Obliczona kolumna w EF Code First

  5. Wybór procesora dla SQL Server 2014 – część 2