[英]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.