代码之家  ›  专栏  ›  技术社区  ›  Hernán Eche Shankar ARUL

在Mysql中,如何在一个时间窗口中对一个值进行多天的平均?

  •  1
  • Hernán Eche Shankar ARUL  · 技术社区  · 8 年前

    拥有这个简单的日志表

    id  |val   |dt
    -------------------------
     A  100     2014-01-15 00:00:00     
     A  160     2014-01-15 00:00:00      
     A  100     2014-01-15 01:00:00     
     A  160     2014-01-15 02:00:00
     A  200     2014-01-15 03:00:00
     A  80      2014-01-16 01:00:00
     B  100     2014-01-16 02:00:00
     B  200     2014-01-16 01:00:00
     B  100     2014-01-15 02:00:00
     and so on...
    

    通过这样做,我可以在指定的范围(0-2)内对单个给定id(a)的一天(15)求平均值

    select id, 
           date(dt),
           AVG(val) as av
    from (SELECT id, val, dt
          FROM test
          WHERE id = 'A' AND 
                (date(dt) BETWEEN '2014-01-15' AND '2014-01-15') AND 
                ( (time(dt) BETWEEN '00:00' AND '02:00'))) as outerTable
    

    我得到了这个单一的结果

    id  |date   | average 00:00 to 2:00
    -------------------------
    A   2014-01-15  120.0000
    

    但如何解决同一时间段内多天的平均值,但在几个月的范围内多天的平均值?年?喜欢

    id  |date   | average 00:00 to 2:00
    -------------------------
    A   2014-01-15  120.0000
    A   2014-01-16  80.0000 
    A   2014-01-17  35.0000
    and so on...
    

    需要在整个月或年的不同日期循环相同的查询,当然文字循环可以在php中完成,但它很慢,我也可以循环每个ID,使它变慢。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Madhur Bhaiya    8 年前

    您不需要使用子查询来获取数据,然后在外部查询中计算平均值。它可以在没有子查询本身的情况下完成。

    为了获得不同日期的平均值,可以删除 WHERE 条件on date,以获取所有日期的数据。您还可以更改 哪里

    id 哪里 条件 也

    GROUP BY 上 和 date ,以idwise方式获取单个行,然后以datewise方式获取。

    SELECT 
      id, 
      DATE(dt)
      AVG(val) 
    FROM test
    WHERE 
      TIME(dt) BETWEEN '00:00' AND '02:00'
    GROUP BY id, DATE(dt)