Это можно сделать с помощью оконных функций (доступно в MySQL 8.0).
Можно отключить набор результатов, а затем использовать lag()
для проверки предыдущей записи. Предполагая, что id
s всегда увеличивается на 1
, вы можете сделать:
select
item,
sum(case when id = lag_id + 1 then 1 else 0 end) cnt_consecutive
from (
select
t.*,
lag(id) over(partition by item order by id) lag_id
from (
select id, item1 item from mytable
union all select id, item2 from mytable
union all select id, item3 from mytable
) t
) t
group by item
order by item
Если у вас нет увеличенного столбца, вы можете сгенерировать его с помощью dense_rank()
:
select
item,
sum(case when new_id = lag_new_id + 1 then 1 else 0 end) cnt_consecutive
from (
select
t.*,
lag(new_id) over(partition by item order by new_id) lag_new_id
from (
select
t.*,
dense_rank() over(order by id) new_id
from (
select id, item1 item from mytable
union all select id, item2 from mytable
union all select id, item3 from mytable
) t
) t
) t
group by item
order by item
В это БД Fiddle , оба запроса возвращают:
item | cnt_consecutive
:---- | --------------:
Bird | 1
Cat | 2
Dog | 0
Horse | 3
Rat | 0