【问题标题】:How to average hourly interval data for a 12 hour range in SQL Server from 8am to 8pm given daily hourly data?给定每日每小时数据,如何在 SQL Server 中从上午 8 点到晚上 8 点平均 12 小时范围内的每小时间隔数据?
【发布时间】:2021-02-02 11:24:23
【问题描述】:

我的数据库中有每小时间隔的数据,格式如下:

EFFECTIVEDATETIME       NEW_YORK ETC...                
---------------------------------------
2017-01-01 01:00:00.000 44
2017-01-01 02:00:00.000 44
2017-01-01 03:00:00.000 45
2017-01-01 04:00:00.000 44
2017-01-01 05:00:00.000 45
2017-01-01 06:00:00.000 44
2017-01-01 07:00:00.000 44
2017-01-01 08:00:00.000 44
2017-01-01 09:00:00.000 44
2017-01-01 10:00:00.000 46
2017-01-01 11:00:00.000 45
2017-01-01 12:00:00.000 46
2017-01-01 13:00:00.000 47
2017-01-01 14:00:00.000 47
2017-01-01 15:00:00.000 47
2017-01-01 16:00:00.000 47
2017-01-01 17:00:00.000 46
2017-01-01 18:00:00.000 45
2017-01-01 19:00:00.000 43
2017-01-01 20:00:00.000 41
2017-01-01 21:00:00.000 42
2017-01-01 22:00:00.000 42
2017-01-01 23:00:00.000 41

我试图仅在特定范围内(从 08:00:00.000 到 20:00:000)对纽约和后续列进行平均。使用以下代码,我一整天都可以做到这一点。但是,我希望能够仅在 12 小时内平均我的数据。任何帮助将不胜感激,谢谢!

SELECT 
    CAST(EFFECTIVEDATETIME AS DATE) AS EFFECTIVE_DATE,
    AVG(CASE WHEN WEATHERSTATIONID = 'KNYC' THEN TEMPERATURE ELSE NULL END) AS NEW_YORK,
    AVG(CASE WHEN WEATHERSTATIONID = 'KNYC' THEN DEWPOINT ELSE NULL END) AS NEW_YORK_DEWPOINT,
    AVG(CASE WHEN WEATHERSTATIONID = 'KNYC' THEN RelativeHumidity ELSE NULL END) AS NEW_YORK_HUMIDITY,
    MAX(CASE WHEN WEATHERSTATIONID = 'KNYC' THEN TEMPERATURE ELSE NULL END) AS NEW_YORK_DAILY_MAX,
    MIN(CASE WHEN WEATHERSTATIONID = 'KNYC' THEN TEMPERATURE ELSE NULL END)  AS NEW_YORK_DAILY_MIN
FROM
    DBO.WeatherHourly
WHERE
    EffectiveDateTime > '2017-01-01'
GROUP BY 
    CAST(EFFECTIVEDATETIME AS DATE)
ORDER BY 
    EFFECTIVE_DATE

【问题讨论】:

  • 我删除了不一致的数据库标签。请仅使用您真正使用的数据库进行标记。
  • 不是 100% 清楚,但似乎如果您将时间检查添加到 EffectiveDateTime 以仅包括 8 到 20 之间的时间,您应该得到您想要的

标签: sql sql-server datetime where-clause


【解决方案1】:

如果要将开始时间限制在区间内,可以使用:

WHERE EffectiveDateTime > '2017-01-01' AND
      CAST(EffectiveDateTime as TIME) BETWEEN '08:00:00' AND '20:00:00'

如果您还想对结束日期/时间进行限制,那就更具挑战性了。

【讨论】:

  • 谢谢你的兄弟- 为之前的标签道歉!
【解决方案2】:

您可以在WHERE 子句中添加一个过滤条件:

SELECT CAST(EFFECTIVEDATETIME AS DATE) AS EFFECTIVE_DATE,
    AVG(CASE WHEN WEATHERSTATIONID = 'KNYC' THEN TEMPERATURE ELSE NULL END) AS NEW_YORK,
    AVG(CASE WHEN WEATHERSTATIONID = 'KNYC' THEN DEWPOINT ELSE NULL END) AS NEW_YORK_DEWPOINT,
    AVG(CASE WHEN WEATHERSTATIONID = 'KNYC' THEN RelativeHumidity ELSE NULL END) AS NEW_YORK_HUMIDITY,
    MAX(CASE WHEN WEATHERSTATIONID = 'KNYC' THEN TEMPERATURE ELSE NULL END) AS NEW_YORK_DAILY_MAX,
    MIN(CASE WHEN WEATHERSTATIONID = 'KNYC' THEN TEMPERATURE ELSE NULL END)  AS NEW_YORK_DAILY_MIN
FROM DBO.WeatherHourly
WHERE EffectiveDateTime > '2017-01-01' AND DATEPART(hour, EffectiveDateTime) BETWEEN 8 AND 19
GROUP BY CAST(EFFECTIVEDATETIME AS DATE)
ORDER BY EFFECTIVE_DATE

【讨论】:

  • 谢谢!不知道你可以添加一个 and 语句并以这种方式过滤它
猜你喜欢
  • 2020-01-26
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多