Вы можете обойтись с помощью функции single window, которая должна быть самой быстрой:
SELECT side, count(*) AS count
FROM (
SELECT side, grp
FROM (
SELECT side, number - row_number() OVER (PARTITION BY side ORDER BY number) AS grp
FROM tbl
WHERE info = 'bar'
) sub1
GROUP BY 1, 2
) sub2
GROUP BY 1
ORDER BY 1; -- optional
Или короче, может быть, не быстрее:
SELECT side, count(DISTINCT grp) AS count
FROM (
SELECT side, number - row_number() OVER (PARTITION BY side ORDER BY number) AS grp
FROM tbl
WHERE info = 'bar'
) sub
GROUP BY 1
ORDER BY 1; -- optional
«Хитрость» заключается в том, что соседние строки, образующие группу (grp
), имеют последовательные номера.При вычитании счетчика прогонов по разделу в side
из счетчика прогонов по всем строкам (number
), члены «группы» получают одинаковое число grp
.
При наличии пробелы в вашем последовательном столбце number
, что не так в вашей демоверсии, но обычно есть пробелы (и вы действительно хотите игнорировать такие пробелы ?!), затем используйте row_number() OVER (ORDER BY number)
в подзапросе вместо простоnumber
чтобы сначала закрыть пробелы:
SELECT side, count(DISTINCT grp) AS count
FROM (
SELECT side, number - row_number() OVER (PARTITION BY side ORDER BY number) AS grp
FROM (SELECT info, side, row_number() OVER (ORDER BY number) AS number FROM tbl) tbl1
WHERE info = 'bar'
) sub2
GROUP BY 1
ORDER BY 1; -- optional
SQL Fiddle (с расширенным контрольным примером)
Похожие: