Korzystanie
datediff(minute, '1990-01-01T00:00:00', yourDatetime)
daje liczbę minut od 01.01.1990 (można użyć żądaną datę bazową).
Następnie można podzielić przez 5, 15, 30 lub 60 i pogrupować według wyniku tego podziału. Załatałem, że zostanie ono ocenione jako dzielenie całkowite, więc otrzymasz liczbę całkowitą, której możesz użyć do grupowania według.
tj
group by datediff(minute, '1990-01-01T00:00:00', yourDatetime) /5
UPDATE jak oryginalne pytanie był edytowany wymagać dane mają być wyświetlane w formacie daty i czasu po zgrupowania, Dodałem tę prostą kwerendę, która będzie robić to, co OP chce:
-- 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: mam ten podzielony na 3 podzapytania dla jasności. Powinieneś przeczytać to od środka. Można go oczywiście napisać jako pojedyncze, kompaktowe zapytanie: UWAGA: jeśli zmienisz okres i początkową datę-czas, możesz uzyskać dowolny przedział czasowy, np. Tygodnie zaczynające się od danego dnia, lub cokolwiek może trzeba
Jeśli chcesz wygenerować dane testowe dla tego zapytania użyj:
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)
efektem wykonania zapytania jest następująca:
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
Nie jest dla mnie oczywiste, co rozumiesz przez "zgrupowanie w różnych odstępach czasu". Przypominając, że wyniki są koniecznie wierszami w kolumnach, czy możesz pokazać, jak będą wyglądały przykładowe wiersze Twoich danych? W szczególności nie jest dla mnie jasne, czy jeden id będzie w 1 5-minutowej grupie, także w jednej 15-minutowej grupie, także w jednej 30-minutowej grupie ... itd. Jeśli na przykład każdy rekord będzie w 4 grupach, jakie są nazwy kolumn, które chcesz uzyskać w wyniku? –
Jeśli masz zamiar opublikować kilka pytań sql, 1) zawsze taguj pytanie określonym typem serwera (widzę z tytułu, że jest to MS SQL, ale jeśli używałeś tagów, które sugerują ci że możesz podać wersję) i 2) możesz obniżyć "koszt ustalania, co to pytanie oznacza", poświęcając czas na skonfigurowanie skrzypka sql (http://sqlfiddle.org); pozwala umieścić w przykładach dane, które chcesz przesłać. –
Po prostu wyczyścić coś: 'DATETIME' w SQL Server jest ** nigdy ** przechowywany w formacie opartym na łańcuchach - jest przechowywany jako dwie 4-bajtowe wartości INT wewnętrznie. Ten format może być twoją ** domyślną prezentacją ** - ale jest ** NIE ** przechowywany w tym formacie! –