【问题标题】:Take Hourly Average in SQL在 SQL 中取每小时平均值
【发布时间】:2012-03-16 20:33:13
【问题描述】:

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

我正在尝试获取 Value 列的每小时平均值,但我似乎无法使其正常工作。最终输出将显示 TimeStamp 的开始时间,以及 Value 列的平均值。

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

2005-02-17 14:00:00    2.125

【问题讨论】:

  • 这是什么类型的数据库?
  • @dldnh 这是 sql server。点击标签 (tsql) 了解想法
  • 那是个t?对我的眼睛来说太小了——对此感到抱歉!

标签: tsql ssms average


【解决方案1】:

我会这样做:

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

【讨论】:

  • 这很好用。有没有办法把小时放回时间戳?
【解决方案2】:
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+

【讨论】:

  • 太好了,双重演员就可以了。在我为 datepart 小时和日期设置单独的列之前。您仍然可以简化 group by CAST(Time_Stamp as date), datepart(hh,Time_Stamp)(而不是整个 dateadd 函数)。
【解决方案3】:
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 列中所有值的小时值,并根据每小时计算第二列的平均值。

【讨论】:

  • 这行得通,但是在 GROUP BY 子句中我想按日期和小时分组。因此,对于 2005-02-17 14:00 到 2005-02-17 14:59 的时间间隔,我希望 TimeStamp 列显示 2005-02-17 14:00 而不仅仅是 14。
  • 好吧..如果是这样的话,尝试同时使用 substring 和 concat 函数来获得所需的输出......试试看告诉我......如果你不明白,我会帮忙你有答案...
  • 这只需要“小时”,但他需要日期和时间。例如:SELECT DATEPART(hour,'2012-03-19 09:12') 结果为 "9" 但他需要 "2012-03-19 09:00"
  • @Hooijdonk 是的,我知道...但我让他试一试...我知道解决方案是什么...。
【解决方案4】:

我想你也希望它按日期分组,而不仅仅是按小时,对吧?

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

【讨论】:

    【解决方案5】:
    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多