Таблица:
create table conv (id int, serial_number_basic int, product_id int);
insert into conv (id, serial_number_basic, product_id) values
(1,1,1),
(2,2,1),
(3,3,1),
(4,5,1),
(5,6,1),
(6,1,2),
(7,3,2),
(8,8,2),
(9,9,2),
(10,2,3)
;
Запрос:
set @snb := 1;
set @pid := -1;
select sw.product_id, min(sw.serial_number_basic) as lowest_gap
from (
select
case
when @pid != ss.product_id
then @snb := 1
else @snb := @snb + 1
end as serial_number_basic,
@pid := ss.product_id as product_id
from (
select serial_number_basic, product_id
from conv
order by product_id, serial_number_basic
) ss
) sw
left outer join conv
on sw.product_id = conv.product_id
and
sw.serial_number_basic = conv.serial_number_basic
where conv.product_id is null
group by sw.product_id
order by sw.product_id
;
Результат:
+------------+------------+
| product_id | lowest_gap |
+------------+------------+
| 1 | 4 |
| 2 | 2 |
| 3 | 1 |
+------------+------------+
3 rows in set (0.00 sec)
EDIT:
Вероятно, намного быстрее:
set @snb := 1;
set @pid := -1;
select product_id, min(gap) as lowest_gap
from (
select
case
when @pid != product_id
then @snb := 1
else @snb := @snb + 1
end,
case
when @snb != serial_number_basic
then @snb else null
end as gap,
@pid := ss.product_id as product_id
from (
select serial_number_basic, product_id
from conv
order by product_id, serial_number_basic
) ss
) sw
where gap is not null
group by product_id
order by product_id
;