2014-12-10 6 views
0

Я не являюсь разработчиком sql, поэтому, возможно, то, что я пытаюсь сделать, просто, но я не могу найти легкое решение.Вычислить почасовое среднее значений за промежуток времени

У меня есть серия почасовых данных, между двумя датами. Что-то вроде этого:

DATETIME   VALUE 
------------------------- 
2014-01-01 01:00 104 
2014-01-01 02:00 56 
... 
2014-01-04 23:00 65 
2014-01-05 00:00 145 

То, что я хочу, за каждый час, получая среднее значение каждого дня в тот час, поэтому я заканчиваю запрос с чем-то вроде этого:

01:00 67.65 
02:00 43.00 
.... 
00:00 89.45 

Значение «01:00» будет равняться среднему значению всех значений «01:00» каждого дня и т. Д.

Алгоритм прост, но мои навыки SQL довольно слабый :-)

БОНУС

Было бы удивительным, если ответ будет включать в себя изменение одной и той же задачи: расчет средних значений от дни недели и час, а не только час:

Monday 01:00 34.23 
Monday 02:00 54.34 
... 
Monday 23:00 241.34 
Tuesday 00:00 89.43 
.... 
Sunday 23:00 49.33 
+0

Вы знакомы с [ 'GROUP BY'] (http://www.sqlteam.com/article/how-to-use-group-by-in-sql-server) пункта? –

ответ

2

Вы можете использовать datename, datepart и group by

select datename(weekday, [datetime]) as [Day], 
     datepart(hour, [datetime]) as [Hour], 
     avg(value) as AvgValue, 
     datepart(weekday, [datetime]) as [DayNo] 
from table1 
group by datename(weekday, [datetime]), datepart(weekday, [datetime]), 
     datepart(hour, [datetime]) 
order by datepart(weekday, [datetime]), datepart(hour, [datetime]) 
0

Ниже приведен пример общего агрегированного запроса, который вы можете использовать для группировки по временному интервалу.

WITH intervals AS (
    SELECT DATEADD(hour, DATEDIFF(hour, '', DATETIME), '') AS TimeInterval 
    ,VALUE 
    FROM dbo.Foo 
    ) 
SELECT 
     TimeInterval 
    , DATENAME(weekday, TimeInterval) AS Weekday 
    , CAST(TimeInterval AS time) 
    , AVG(VALUE) AS AvgValue 
FROM intervals 
GROUP BY TimeInterval 
ORDER BY TimeInterval; 
Смежные вопросы