I think you also want it to be grouped by date, not just by hour, right?
select convert(VARCHAR(10), date, 111) as aDate, datepart(HH, date) anHour, avg(value) anAverage from t group by convert(VARCHAR(10), date, 111), datepart(HH, date)
Or that:
; with aTable as ( select convert(VARCHAR(10), date, 111) as aDate, datepart(HH, date) anHour, value from t) select aDate, anHour, avg(value) from aTable group by aDate, anHour
source share