2012-03-16 146 views
4

我有一个包含2个字段的SQL表: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 

我想每小时取平均值的列,但我似乎无法使这项工作正确。最终输出将显示TimeStamp的开始小时数以及Value列的平均值。

对于最终的输出结果,我期望得到一个完整的时间戳结果,而不仅仅是小时。因此,从14:00 - 14:59在2005-02-17输出结果将是:

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

这是什么类型的数据库? – dldnh 2012-03-16 20:38:03

+0

@dldnh这是sql服务器。点击标签([tag:tsql])以获得想法 – 2012-03-16 20:41:08

+0

这是一个t?对我的眼睛来说太小了 - 对此感到遗憾! – dldnh 2012-03-16 20:42:11

回答

3

我会这样做:

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 2012-03-19 16:44:30

+0

是的,我的解决方案显示如何;-) – 2012-03-19 17:12:15

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

OR

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 2012-03-16 20:56:26

+0

好的..如果这是案例尝试使用子字符串和concat函数一起得到所需的输出...试试看n告诉我...如果你没有得到它,我会帮你的答案... – Teja 2012-03-16 22:12:36

+0

这只需要“小时“,但他需要约会和约会。例如:SELECT DATEPART(小时,'2012-03-19 09:12')结果“9”,但他需要“2012-03-19 09:00” – adyusuf 2012-03-19 07:13:02

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服务器2008+