从第二个每分钟的平均值

时间:2014-12-01 18:25:05

标签: sql sql-server tsql sql-server-2012

我的表:

timestamp               | value
------------------------+---------
2013-08-31 22:00:01.000 | 19.1
2013-08-31 22:00:03.000 | 21.5
...

由于我的数据系列中缺少秒数,我想计算每分钟的平均值。因此,我想在几分钟之内完成数据系列,而不是在几秒钟内完成数据系列,如下所示:

timestamp        | value
-----------------+---------
2013-08-31 22:00 | 19.5
2013-08-31 22:01 | 21.1
...

我怎么能写一个给我这个结果的SQL查询?我正在使用SQL Server 2012.

3 个答案:

答案 0 :(得分:1)

您可以使用格式为100的CONVERT()删除秒数:

SELECT CONVERT(VARCHAR,GETDATE(),100) AS Dt
      ,AVG(value)
FROM YourTable
GROUP BY CONVERT(VARCHAR,GETDATE(),100)

如果需要,您可以重新投射为DATETIME()

CAST(CONVERT(VARCHAR,GETDATE(),100)AS DATETIME)   

它有秒/毫秒,但它们都是零。

答案 1 :(得分:1)

从datetime到smalldatetime的转换避免了与日期到字符的最新转换相关的繁琐(并且计算速度慢)。以下将计算每分钟的平均值。

SELECT
   cast(Timestamp as smalldatetime)  Timestamp
  ,avg(value)  Value
 from PageLogs
 group by cast(Timestamp as smalldatetime)
 order by cast(Timestamp as smalldatetime)

缺点是四舍五入;这将转换21:00:30.000和22:01:29.997至22:00之间的值。如果您需要平均按"日历"分钟(22:00:00:00到22:00:59.997),您必须调整时间(毫秒级)以获得正确的断点,如下所示:

SELECT
   cast(dateadd(ms, -30000, Timestamp) as smalldatetime)  Timestamp
  ,avg(value)  Value
 from PageLogs
 group by cast(dateadd(ms, -30000, Timestamp) as smalldatetime)
 order by cast(dateadd(ms, -30000, Timestamp) as smalldatetime)

答案 2 :(得分:0)

Goat CO的回答是有效的,但是如果您需要在示例中使用确切的日期格式,则需要手动构建它:

select
    convert(varchar, datepart(year, ts)) + '-' +
    convert(varchar, datepart(month, ts)) + '-' +
    convert(varchar, datepart(day, ts)) + ' ' +
    convert(varchar, datepart(hour, ts)) + ':' +
    convert(varchar, datepart(minute, ts)) as timestamp,
    avg(value) as value
from
    tbl
group by
    datepart(year, ts),
    datepart(month, ts),
    datepart(day, ts),
    datepart(hour, ts),
    datepart(minute, ts)