我的MySQL表是由一个电位器,一个硬件来填充的。
当传感器更改数据的值被添加到名为Pot的MySQL表列中时。
Pot是一个列,它包含随着时间的推移从电位计读取的值。
此列中的值范围为760到1007。
此列中的值不能立即从760跳到1007,必须是连续的。
所以这张桌子是这样的:

    ***Pot***
Time 1s -> 1007
Time 2s -> 987
Time 3s -> 909
Time 4s -> 887
time 5s -> 779
Time 6s -> 775
Time 7s -> 767
Time 8s -> 1004
Time 9s -> 1004
Time 10s -> 1004
Time 11s -> 1001
Time 12s -> 987
Time 13s -> 899

我添加的时间箭头显示,在时间1秒时,硬件会添加一个值,时间2s 987会添加…在实验开始后7秒时,767会添加。
一旦达到下限值,传感器开始输入接近上限的值,如1007等。从高值开始,传感器再次向下限输入值。可能有重复项,但正如您所看到的,行是随着时间推移而输入的。
我要做的是找出传感器值从上限到下限的次数。
因此,在这种情况下,循环次数的输出是1,而不是2,因为这些值还没有达到760微秒,可以认为是2个循环。
select count(*)
from (select cycle, min(BBQ_Chicken) as minpot, maxpot as maxpot
      from (select *,
                   @cycle = if(pot >= 1000 and @state = 'bottom',
                               if(@state := 'top', @cycle + 1, @cycle + 1),
                               if(pot < 770, if(@state := 'bottom', @cycle, @cycle), @cycle)
                              ) as cycle
            from `SeInfo` t cross join
                 (select @state := 'bottom', @cyclestart) vars
            order by id
           ) p
     ) t
where minpot < 770 and maxpot >= 1000;

上面的代码在我运行查询时不返回任何行…有什么想法吗?

最佳答案

我想你需要一个状态机来跟踪最近是否有什么东西到达了范围的顶部或底部。然后,可以使用到顶部的过渡来测量循环何时开始。下面获取有关周期的摘要信息:

select cycle, min(pot+0) as minpot, max(pot+0) as maxpot
from (select si.*,
             @cycle := if(pot >= 1000 and @state = 'bottom',
                          if(@state := 'top', @cycle + 1, @cycle + 1),
                          if(pot < 770, if(@state := 'bottom', @cycle, @cycle), @cycle)
                         ) as cycle
      from SeInfo si cross join
           (select @state := 'bottom', @cycle := 0) vars
      order by id
     ) si
group by cycle;

您可以将此用作子查询,以获取满足条件的号码:
select count(*)
from (select cycle, min(pot+0) as minpot, max(pot+0) as maxpot
      from (select si.*,
                   @cycle := if(pot >= 1000 and @state = 'bottom',
                                if(@state := 'top', @cycle + 1, @cycle + 1),
                                if(pot < 770, if(@state := 'bottom', @cycle, @cycle), @cycle)
                               ) as cycle
            from SeInfo si cross join
                 (select @state := 'bottom', @cycle := 0) vars
            order by id
           ) si
      group by cycle
     ) si
where minpot < 770 and maxpot >= 1000;

注意,这假设您有一个列指定值的顺序。SQL表表示无序集,因此需要一列来指定顺序。
HereSQL是否在处理它。

10-06 15:27