samej logiki jak rexem, ale działa na wszelkich RDBMS okienkowych-stanie (nie będzie działać na MySQL jeszcze):
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');
źródło:
1 a
2 a
3 a
4 a
5 b
6 b
7 a
8 a
9 a
Zapytanie w stylu okna: (działa na windowing-c apable 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
wyjściowa:
1 a 4
5 b 2
7 a 3
BTW, jest to wynikiem grouped_result bez 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
Czuje się dobrze przepisywanie mysqlism-maila do ANSI -konfigurowanie jednego :-) Na razie, podczas gdy mysql nie ma jeszcze możliwości tworzenia okien, odpowiedź rexemu jest najlepsza. Rexem, to dobra technika mysql (JOIN (SELECT @rownum: = 0)) tam, a afaik MSSQL i PostgreSQL nie obsługują domyślnie zadeklarowanej zmiennej, kudos! :-)
transpose +1 na prawą stronę, a następnie wprowadź -1. więc nie spowoduje to skanowania tabeli. mysql nie może mieć indeksu o wyrażeniu –
To wszystko! Wielkie dzięki! – Kuyenda
Jeśli użyjesz 'CASE WHEN xt.id IS NULL OR x.val = x.val', to SQL nie złamie się, gdy val jest celowo NULL, ale nadal przechwytuje pierwsze porównanie z offsetem. – Kuyenda