【问题标题】:SQL - MySQL - average group by and limit problemsSQL - MySQL - 平均分组和限制问题
【发布时间】:2014-12-11 01:11:02
【问题描述】:

我正在从各种远程传感器收集数据,这些传感器每隔几秒就会发送一次数据。我记录了远程传感器的名称以及自上次从该仪器接收数据以来的时间差。每个仪器的数据以随机顺序出现,而不是按设定的时间间隔排列。

表格如下:

id  instname  timediff
 1   inst01     1000
 2   inst02     1100
 3   inst01     1210
 4   inst03      900  
etc.

id 列是自动递增的。

我想要做的是获取每个工具最后 10 个值的平均时间差异。

我得到的最接近的是:

SELECT 
    inst AS Instrument, 
    AVG(diff / 1000) AS Average
FROM
    (SELECT 
        instname AS inst, timediff AS diff
    FROM
        log
        WHERE
        instname = 'Inst01' 
    ORDER BY id DESC
    LIMIT 0 , 10) AS two

显然,这只适用于 1 台仪器,我也不相信限制是否正常工作。我不知道仪器的名称,也不知道我将从其中收集多少数据。

如何使用 SQL 获得每个仪器最后 10 个值的平均 timediff?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    有点痛苦。我认为最简单的方法是使用变量。以下查询列举了每个仪器的读数:

    select l.*,
           (@rn := if(@i = instname, @rn + 1, 
                      if(@i := instname, 1, 1)
                     )
           ) as rn
    from log l cross join
         (select @i := '', @rn := 0)
    order by instname, id desc;
    

    然后您可以将其用作子查询来进行计算:

    select instname, avg(timediff)
    from (select l.*,
                 (@rn := if(@i = instname, @rn + 1, 
                            if(@i := instname, 1, 1)
                           )
                 ) as rn
          from log l cross join
               (select @i := '', @rn := 0)
          order by instname, id desc
         ) l
    where rn <= 10
    group by instname;
    

    【讨论】:

    • 天哪!这似乎有效!我不会在星期一的一个月内得到那个解决方案,以前从未使用过变量。我担心枚举查询在较大的表上会很耗时。我应该吗?
    • 它可能比桌面上的其他解决方案更快!
    【解决方案2】:

    尝试使用这个:在较少的数据上进行了测试,但应该可以工作。

    SELECT 
        inst AS Instrument, 
         diff AS Average
    FROM
        (SELECT 
            t1.instname AS inst,AVG(t1.timediff / 1000) AS diff
        FROM
            inst t1,inst t2
            WHERE
            t1.instname = t2.instname   group by t1.instname ORDER BY t2.id DESC
        LIMIT 0,10
        ) AS two
    

    【讨论】:

    • 谢谢。 t1, t2 把戏——我忘记了。不过,此查询需要很长时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多