2012-03-16 2 views
4

У меня есть таблица SQL с 2 полями: TimeStamp и Value. Ниже приведен фрагмент некоторых данных.Принимать почасовое среднее значение в SQL

2005-02-17 13:31:00  2 
2005-02-17 13:46:00  3 
2005-02-17 14:01:00  1.7 
2005-02-17 14:16:00  2.3 
2005-02-17 14:31:00  2 
2005-02-17 14:46:00  2.5 
2005-02-17 15:01:00  2.2 
2005-02-17 15:16:00  2.4 
2005-02-17 15:31:00  2.6 
2005-02-17 15:46:00  2.6 
2005-02-17 16:01:00  2.7 

Я пытаюсь взять среднечасовой столбца Value, однако я не могу показаться, чтобы сделать эту работу правильно. Конечный результат будет показывать начальный час для TimeStamp и усредненное значение для столбца Value.

Для окончательного вывода я ищу, чтобы получить полную метку времени в результате, а не только час. Таким образом, с 14:00 - 14:59 по 2005-02-17 полученный результат будет:

2005-02-17 14:00:00 2.125 
+0

какой тип базы данных это будет? – dldnh

+0

@dldnh это сервер sql. щелкните тег ([tag: tsql]), чтобы получить идею –

+0

, что является t? слишком крошечный для моих глаз - извините! – dldnh

ответ

3

I сделал бы это следующим образом:

SELECT  CAST(FLOOR(CAST(timestamp AS float)) AS datetime) AS day --strip time 
      , DATEPART(hh, timestamp) AS hour 
      , AVG(value) AS average 
FROM  times 
GROUP BY CAST(FLOOR(CAST(timestamp AS float)) AS datetime) 
      , DATEPART(hh, timestamp) 

Пример fiddle.

+0

Это отлично работает. Есть ли способ вернуть час назад в метку времени? – Andrew

+0

Да, мое решение ниже показывает, как ;-) –

3
SELECT DATEPART(hour,Col1) as hourcol,AVG(Col2) 
FROM Yourtable 
GROUP BY hourcol; 

ИЛИ

SELECT SUBSTRING(Col1,1,14)+'00' AS hourcol,AVG(Col2) 
FROM Yourtable 
GROUP BY hourcol; 

В этой функции DATEPART запрос вычисляет значение часов для всех значения в столбце DATETIME и на основе каждого часа вычисляется среднее значение второго столбца на уровне часа.

+0

Это работает, однако в предложении GROUP BY я хочу группировать дату и час. Итак, за интервал 2005-02-17 14:00 по 2005-02-17 14:59 Мне хотелось бы, чтобы колонка TimeStamp показывала 2005-02-17 14:00 вместо 14. – Andrew

+0

Хорошо .. если это случай попытается использовать обе подстроку и concat функции вместе, чтобы получить желаемый результат ... попробуйте это n скажите мне ... если у не получится, я помогу u с ответом ... – Teja

+0

Это занимает только " час ", но ему нужна дата и ночь вместе. Например: SELECT DATEPART (час, '2012-03-19 09:12') результаты "9", но ему нужно "2012-03-19 09:00" – adyusuf

0

Я думаю, вы также хотите, чтобы это было сгруппировано по дате, а не только по часам, правда?

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) 

Или это:

; 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 
0
SELECT 
    AVG(myvalue) [Average], 
    DATEADD(HOUR, DATEPART(HOUR, mydate), CAST(CAST(mydate as Date) as datetime)) [Hour] 
FROM 
    myTable 
GROUP BY 
    DATEADD(HOUR, DATEPART(HOUR, mydate), CAST(CAST(mydate as Date) as datetime)) 
ORDER BY 
    DATEADD(HOUR, DATEPART(HOUR, mydate), CAST(CAST(mydate as Date) as datetime)) 
4
select Time_Stamp_Hour=dateadd(hh,datepart(hh,Time_Stamp), cast(CAST(Time_Stamp as date) as datetime)) 
, AvgValue=AVG(Value) 
from ValueLog 
group by dateadd(hh,datepart(hh,Time_Stamp), cast(CAST(Time_Stamp as date) as datetime)) 

Результат:

Time_Stamp_Hour   AvgValue 
----------------------- ---------------------- 
2005-02-17 13:00:00.000 2.5 
2005-02-17 14:00:00.000 2.125 
2005-02-17 15:00:00.000 2.45 
2005-02-17 16:00:00.000 2.7 

Совместимость: Sql Server 2008+

Смежные вопросы