Это проблема пробелов и островков. Вам просто нужно перечисление строк, чтобы это работало. В MySQL 8+ вы бы использовали row_number()
, но вы можете использовать глобальное перечисление здесь:
select record_id, min(created) as min_created, max(created) as max_created, count(*) as num_months
from (select bi.*, (created - interval n month) as grp
from (select bi.*, (@rn := @rn + 1) as n -- generate some numbers
from batch_item bi cross join
(select @rn := 0) params
order by bi.record_id, bi.month
) bi
) bi
group by record_id, grp;
Обратите внимание, что при использовании row_number()
вы обычно partition by record_id
. Однако в этом нет необходимости, если номера созданы в правильной последовательности.
Приведенный выше запрос возвращает острова. Для получения окончательных результатов вам необходим еще один уровень агрегирования:
select record_id, avg(num_months)
from (select record_id, min(created) as min_created, max(created) as max_created, count(*) as num_months
from (select bi.*, (created - interval n month) as grp
from (select bi.*, (@rn := @rn + 1) as n -- generate some numbers
from batch_item bi cross join
(select @rn := 0) params
order by bi.record_id, bi.month
) bi
) bi
group by record_id, grp
) bi
group by record_id;