我正在收集来自各种远程传感器的数据,它们每隔几秒钟发送一次数据。我记录了遥感器的名称和上次从那个仪器接收数据以来的时差。每个仪器的数据都是随机的,而不是固定的间隔。
这张桌子看起来是:
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
很明显,这只适用于一种乐器,我也不相信这个极限也能正常工作。我不知道这些仪器的名字,也不知道我将从多少仪器收集数据。
如何使用SQL获得每个仪器的最后10个值的平均时间差?
发布于 2014-12-10 16:37:03
有点痛苦。我认为最简单的方法是使用变量。以下查询列举了每种仪器的读数:
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;
发布于 2014-12-10 17:11:02
尝试使用这个方法:在较少的数据上进行测试,但应该有效。
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
https://stackoverflow.com/questions/27406154
复制相似问题