Gestern fragte mich meine Kollegin Olga nach einem Trick, wie man Datensätze, die in 5-minütigen Intervallen eingefügt wurden mittels GROUP-BY gruppieren kann. Die Frage gefällt mir unheimlich gut, weil sie mit SQL-Server-2005 nur mit ein paar Kniffen zu lösen ist. Man muss das Datum und Uhrzeit nach relevanten Teilen aufsplitten und die Minuten ganzzahlig durch 5 dividieren. Danach muss man dann gruppieren.
Weil ich gerade keine Testtabellen zur Hand habe, nehme ich einfach die Views sys.objects, die in jeder SQL-Server-Datenbank (ab Version 2005) drin ist:
SELECT
CONVERT(nvarchar(12), modify_date, 104) AS "date",
DATEPART(hh, modify_date) AS "hour",
DATEPART(mi, modify_date) AS "minute",
CAST((DATEPART(ss, modify_date)/5)*5 AS NVARCHAR(2))
+' – '+CAST(((DATEPART(ss, modify_date)/5)+1)*5-1 AS NVARCHAR(2)) AS "5 seconds interval",
COUNT(*) AS "num"
FROM sys.objects
GROUP BY
CONVERT(nvarchar(12), modify_date, 104),
DATEPART(hh, modify_date),
DATEPART(mi, modify_date),
DATEPART(ss, modify_date)/5
So finde ich es noch etwas hübscher:
SELECT
date,
hour,
minute,
CAST((second/5)*5 AS NVARCHAR(2))
+' – '+CAST(((second/5)+1)*5-1 AS NVARCHAR(2)) AS "5 seconds interval",
COUNT(*) AS "num"
FROM (SELECT
CONVERT(nvarchar(12), modify_date, 104) AS "date",
DATEPART(hh, modify_date) AS "hour",
DATEPART(mi, modify_date) AS "minute",
DATEPART(ss, modify_date) AS "second"
FROM sys.objects) AS Int
GROUP BY
date,
hour,
minute,
second/5
Natürlich ist das ohne WHERE-Bedingung ziemlich langsam. Aber auch mit kann es nicht besonders schnell sein, weil erst eine Funktion ausgeführt werden muss, bevor die Gruppierung durchgeführt wird. Will man es schnell haben, dann muss man die einzelnen Bestandteile in eigene Spalten legen und einen (clustered) Index darauf legen.