Sql 如何计算2天内每小时数据的平均值

Sql 如何计算2天内每小时数据的平均值,sql,sql-server,Sql,Sql Server,我有以下SQL Server中DB的代码,我唯一的问题是我必须计算从第1天上午10:00:00开始到第2天上午09:00:00的每小时平均值。我以前在特定的小时范围内做过这项工作,但不确定当日期跨越2天时如何做 SELECT EFFECTIVEDATETIME AS EFFECTIVE_DATE, AVG(CASE WHEN WEATHERSTATIONID = 'KBOS' THEN TEMPERATURE ELSE NULL END) AS BOSTON_TEMPERATURE, A

我有以下SQL Server中DB的代码,我唯一的问题是我必须计算从第1天上午10:00:00开始到第2天上午09:00:00的每小时平均值。我以前在特定的小时范围内做过这项工作,但不确定当日期跨越2天时如何做

SELECT EFFECTIVEDATETIME AS EFFECTIVE_DATE,


 AVG(CASE WHEN WEATHERSTATIONID = 'KBOS' THEN TEMPERATURE ELSE NULL END) AS BOSTON_TEMPERATURE,
 AVG(CASE WHEN WEATHERSTATIONID = 'KBOS' THEN DewPoint ELSE NULL END) AS BOSTON_DEWPOINT,
 AVG(CASE WHEN WEATHERSTATIONID = 'KBOS' THEN CloudCover ELSE NULL END) AS BOSTON_CLOUDCOVER,
 AVG(CASE WHEN WEATHERSTATIONID = 'KPVD' THEN TEMPERATURE ELSE NULL END) AS PROVIDENCE_TEMPERATURE,
 AVG(CASE WHEN WEATHERSTATIONID = 'KPVD' THEN DewPoint ELSE NULL END) AS PROVIDENCE_DEWPOINT,
 AVG(CASE WHEN WEATHERSTATIONID = 'KPVD' THEN CloudCover ELSE NULL END) AS PROVIDENCE_CLOUDCOVER

FROM DBO.WeatherHourly 

WHERE EffectiveDateTime >= '2020-01-01' AND DATEPART(day, EffectiveDateTime) BETWEEN 8 AND 23
**--would like to find a way to average hourly data from 10am on day 1 to 9am day 2**
AND WeatherStationId IN ('KBOS', 'KPVD')

GROUP BY EFFECTIVEDATETIME

ORDER BY EFFECTIVEDATETIME
以下是一个例子:

EFFECTIVE_DATE  BOSTON_TEMPERATURE
2020-01-08 00:00:00.000 37
2020-01-08 01:00:00.000 36
2020-01-08 02:00:00.000 36
2020-01-08 03:00:00.000 36
2020-01-08 04:00:00.000 36
2020-01-08 05:00:00.000 35
2020-01-08 06:00:00.000 34
2020-01-08 07:00:00.000 35
2020-01-08 08:00:00.000 34
2020-01-08 09:00:00.000 36
2020-01-08 10:00:00.000 38
2020-01-08 11:00:00.000 40
2020-01-08 12:00:00.000 42
2020-01-08 13:00:00.000 43
2020-01-08 14:00:00.000 44
2020-01-08 15:00:00.000 44
2020-01-08 16:00:00.000 42
2020-01-08 17:00:00.000 37
2020-01-08 18:00:00.000 38
2020-01-08 19:00:00.000 37
2020-01-08 20:00:00.000 37
2020-01-08 21:00:00.000 34
2020-01-08 22:00:00.000 32
2020-01-08 23:00:00.000 31
2020-01-09 00:00:00.000 29
2020-01-09 01:00:00.000 28
2020-01-09 02:00:00.000 28
2020-01-09 03:00:00.000 27
2020-01-09 04:00:00.000 26
2020-01-09 05:00:00.000 25
2020-01-09 06:00:00.000 24
2020-01-09 07:00:00.000 23
2020-01-09 08:00:00.000 23
2020-01-09 09:00:00.000 25
2020-01-09 10:00:00.000 26
2020-01-09 11:00:00.000 27
2020-01-09 12:00:00.000 29
2020-01-09 13:00:00.000 31
所以我想计算2020-01-08 10:00:00到2020-01-09 09:00:00的小时平均值 在这种情况下是33.20左右 我只是以2020-01-08为例,这个查询需要应用到更大的时间范围

我期望的输出如下:

EFFECTIVEDATE BOSTON_TEMPERATURE
2020-01-08   33.20
2020-01-09   30.75   
this date range is continous... not just those 2 days 
您可以使用:

select avg(boston_temperature * 1.0)
from t
where effective_date >= '2020-01-08 10:00:00' and
      effective_date < '2020-01-09 10:00:00';
选择平均值(波士顿温度*1.0)
从t
其中生效日期>='2020-01-08 10:00:00'和
生效日期<'2020-01-09 10:00:00';
对于原始查询,只需减去10小时:

SELECT CONVERT(DATE, DATEADD(HOUR, -10, EFFECTIVEDATETIME)) AS EFFECTIVE_DATE,  
       AVG(CASE WHEN WEATHERSTATIONID = 'KBOS' THEN TEMPERATURE END) AS BOSTON_TEMPERATURE,
       AVG(CASE WHEN WEATHERSTATIONID = 'KBOS' THEN DewPoint END) AS BOSTON_DEWPOINT,
       AVG(CASE WHEN WEATHERSTATIONID = 'KBOS' THEN CloudCover END) AS BOSTON_CLOUDCOVER,
       AVG(CASE WHEN WEATHERSTATIONID = 'KPVD' THEN TEMPERATURE END) AS PROVIDENCE_TEMPERATURE,
       AVG(CASE WHEN WEATHERSTATIONID = 'KPVD' THEN DewPoint END) AS PROVIDENCE_DEWPOINT,
       AVG(CASE WHEN WEATHERSTATIONID = 'KPVD' THEN CloudCover END) AS PROVIDENCE_CLOUDCOVER
FROM DBO.WeatherHourly
WHERE EffectiveDateTime >= '2020-01-01 10:00:00' AND 
      EffectiveDateTime < '2020-01-02 10:00:00' AND
      WeatherStationId IN ('KBOS', 'KPVD')    
GROUP BY CONVERT(DATE, DATEADD(HOUR, -10, EFFECTIVEDATETIME))
ORDER BY MIN(EFFECTIVEDATETIME)
选择转换(日期,日期添加(小时,-10,生效日期时间))作为生效日期,
平均值(当WEATHERSTATIONID='KBOS'然后温度结束时的情况)作为波士顿温度,
平均值(WEATHERSTATIONID='KBOS'然后是露点端时的情况)为波士顿露点,
平均值(当WEATHERSTATIONID='KBOS'然后CloudCover结束时的情况)为BOSTON_CloudCover,
平均值(当WEATHERSTATIONID='KPVD'然后温度结束时的情况)作为普罗维登斯温度,
作为普罗维登斯露点的平均值(当WEATHERSTATIONID='KPVD'然后是露点端时的情况),
平均值(当WEATHERSTATIONID='KPVD'然后CloudCover结束时的情况)为PROVIDENCE\u CloudCover
来自DBO.weatherhour
其中生效日期时间>='2020-01-01 10:00:00'和
有效日期时间<'2020-01-02 10:00:00'和
WeatherStationId位于('KBOS','KPVD')
按转换分组(日期,日期添加(小时,-10,有效日期时间))
按最小值排序(有效日期时间)

是的,这对特定的一天有效,但我需要更长的时间。我只是举了33.20的例子来说明2020-01-08的预期值。@EdiLacic。你的问题有两个问题,但我也回答了。那不就是返回2020-01-01到2020-01-02的值吗?@EdiLacic。这些是查询中的日期。您可以随意调整它们。@EdiLacic:如果答案正确回答了您的问题,请单击复选标记。