Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算时间间隔内每小时值的平均值_Sql_Sql Server - Fatal编程技术网

Sql 计算时间间隔内每小时值的平均值

Sql 计算时间间隔内每小时值的平均值,sql,sql-server,Sql,Sql Server,我不是一个真正的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

我不是一个真正的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
我想要的是,对于每一小时,得到该小时每天的平均值,因此我用如下方式结束查询:

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

您可以使用
datename
datepart
groupby

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]) 

下面是一个可用于按时间间隔分组的常规聚合查询示例

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;
你熟悉这个条款吗?