Reputation: 1334
I have the following table:
oDateTime Value
----------------------------------------------
2017-01-01 00:00:00 10
2017-01-01 00:00:01 20
2017-01-01 00:00:02 10
2017-01-01 00:00:03 10
ff.
The row data is per second on each date. I want to have the following result:
oDateTime Value
----------------------------------------------
2017-01-01 01:00:00 10
So it's the hourly average for each date.
Any idea how to do this?
Thank you.
Upvotes: 0
Views: 148
Reputation: 86706
DATEADD(HOUR, DATEDIFF(HOUR, 0, oDateTime), 0)
will round any DATETIME value, down to the hour. This enables you to keep the DateHour value as a single column.
SELECT
DATEADD(HOUR, DATEDIFF(HOUR, 0, oDateTime), 0),
SUM(value) / 60.0,
AVG(value)
FROM
yourTable
GROUP BY
DATEADD(HOUR, DATEDIFF(HOUR, 0, oDateTime), 0)
EDIT: Less repetition, but slightly longer...
SELECT
rounded.DateHour,
SUM(value) / 60.0,
AVG(value)
FROM
yourTable
CROSS APPLY
(VALUES(DATEADD(HOUR, DATEDIFF(HOUR, 0, oDateTime), 0))) AS rounded(dateHour)
GROUP BY
rounded.DateHour
Upvotes: 1
Reputation: 520918
Try aggregating by the date and hour:
SELECT
CONVERT(varchar, oDateTime, 112) AS date,
DATEPART(hour, oDateTime) AS hour,
AVG(Value) AS Value
FROM yourTable
GROUP BY
CONVERT(varchar, oDateTime, 112),
DATEPART(hour, oDateTime);
Upvotes: 0