В «стандартных функциях SQL» такой функциональности нет, но можно получить желаемый результат с помощью некоторых приемов.
С помощью подзапроса, показанного ниже, мы создаем виртуальное поле, которое вы можете использовать для GROUP BY
во внешнем запросе.Значение этого виртуального поля увеличивается каждый раз, когда в последовательности oID
есть пробел.Таким образом, мы создаем идентификатор для каждого из этих «островков данных»:
SELECT SUM(Area), COUNT(*) AS Count_Rows
FROM (
/* @group_enumerator is incremented each time there is a gap in oIDs continuity */
SELECT @group_enumerator := @group_enumerator + (@prev_oID != oID - 1) AS group_enumerator,
@prev_oID := oID AS prev_oID,
sample_table.*
FROM (
SELECT @group_enumerator := 0,
@prev_oID := -1
) vars,
sample_table
/* correct order is very important */
ORDER BY
oID
) q
GROUP BY
group_enumerator
Тестовая таблица и генерация данных:
CREATE TABLE sample_table (oID INT auto_increment, Area INT, PRIMARY KEY(oID));
INSERT INTO sample_table (oID, Area) VALUES (1,5), (2,2), (3,3), (5,3), (6,4), (7,5);
Мне нужно поблагодарить Quassnoi за указание этот трюк в моем связанном вопросе ; -)
ОБНОВЛЕНИЕ: добавлены тестовая таблица и данные и исправлено повторяющееся имя столбца в примере запроса.