та же логика, что и у rexem, но работает на любой оконной СУБД с поддержкой окон (пока не будет работать на MySQL):
CREATE TABLE tbl
(
id INT,
val VARCHAR(1)
);
INSERT INTO tbl(id,val)
VALUES(1,'a'),(2,'a'),(3,'a'),(4,'a'),(5,'b'),(6,'b'),(7,'a'),(8,'a'),(9,'a');
Источник:
1 a
2 a
3 a
4 a
5 b
6 b
7 a
8 a
9 a
Запрос в оконном стиле: (работает с оконной поддержкой rdbms):
WITH grouped_result AS
(
SELECT x.id, x.val,
COUNT(CASE WHEN y.val IS NULL OR y.val <> x.val THEN 1 END)
OVER (ORDER BY x.id) AS grp
FROM tbl x LEFT JOIN tbl y ON y.id + 1 = x.id
)
SELECT MIN(id) mi, val, COUNT(*)
FROM grouped_result
GROUP BY val, grp
ORDER BY mi
Выход:
1 a 4
5 b 2
7 a 3
Кстати, это результат grouped_result без GROUP BY:
1 a 1
2 a 1
3 a 1
4 a 1
5 b 2
6 b 2
7 a 3
8 a 3
9 a 3
Чувствует себя неплохо, переписывая mysqlism-query к ANSI-совместимому :-) На данный момент, хотя mysql пока не обладает способностью работать с окнами, ответ rexem - лучший. Rexem, это хорошая техника mysql ( JOIN (SELECT @rownum: = 0) ) там, и afaik MSSQL и PostgreSQL не поддерживают неявно объявленную переменную, слава! : -)