繁体   English   中英

SQL-MySQL-平均分组依据和限制问题

[英]SQL - MySQL - average group by and limit problems

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

该表如下所示:

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

id列是自动递增的。

我想做的是获取每个乐器的最后10个值的每个乐器的平均timediff。

我最近的是:

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?

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

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;

尝试使用this:测试较少的数据,但应该可以。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM