mysql统计某字段值相同情况时,对应另外一个字段值变化次数(已补充时间条件排序)

图片说明

类似如图 aa和bb字段在同一张表中
统计aa字段相同时 ,bb值如果从1变为其他值,则统计值加1,从其他值变为
1则统计值加1

如图所示统计结果该是下面的
111 为 2
222 为 3
333 为 1

有一个starttime字段可以用来表示先后
图片说明

aa里面出现的值我是未知的 ,求解select 语句 该怎么写

就你这个问题,无解,除非你增加一个表示顺序的字段。因为记录在数据库里是无序的,
333 1
333 0
333 0
也可以是
333 0
333 1
333 0
相同的数据有多个结果这显然是荒谬的

就这两个字段确实没办法使查询准确,除非允许这种查询相同数据出现不一样结果的情况出现。

先根据aa bb group by,order by starttime,得到你的图1,应该好解决了吧。
得到图1后
先判断aa是否变为其它值,不变的话,判断是不是满足变化条件,再变更计数;
如果变化的初始化,再读一下条aa是不是变化,如果不变再判断变更条件,再变更计数;
aa字段的值和统计结果可以用字典存储

select 
  case when @b<>aa then @a:=-1 end,
  aa,
  @a,
  case when @a<>1 and bb=1 and @a<>-1 then 1
       when @a=1 and bb<>1 then 1 end as if_valid,
  @a:=bb, 
  @b:=aa
from (select @a:=-1) a,
(select @b:=-1)c,
(select * from xx order by aa,starttime asc) b
;

select gy,count(if_valid) from (
select
case when @b<>aa then @a:=-1 end,
aa,
@a,
case when @a<>1 and bb=1 and @a<>-1 then 1
when @a=1 and bb<>1 then 1 end as if_valid,
@a:=bb,
@b:=aa as gy
from (select @a:=-1) a,
(select @b:=-1)c,
(select * from xx order by aa,starttime asc) b ) yy group by gy
;
大佬教我做的