Возьми среднечасовое значение в SQL - PullRequest
6 голосов
/ 17 марта 2012

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

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

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

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

2005-02-17 14:00:00    2.125

Ответы [ 5 ]

4 голосов
/ 17 марта 2012

Я бы сделал это так:

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 .

4 голосов
/ 17 марта 2012
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 +

3 голосов
/ 17 марта 2012
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 голосов
/ 17 марта 2012
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))
0 голосов
/ 17 марта 2012

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

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
...