même logique que rexem, mais fonctionne sur tous les SGBDR de fenêtrage capable (ne fonctionne pas encore sur 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');
source:
1 a
2 a
3 a
4 a
5 b
6 b
7 a
8 a
9 a
requête de style fenêtrage: (fonctionne sur fenêtrage-c SGBDR apable):
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
Sortie:
1 a 4
5 b 2
7 a 3
BTW, ceci est le résultat du grouped_result sans 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
Ça fait du bien ré-écriture mysqlism-requête à la norme ANSI -conforming one :-) Pour l'instant, alors que mysql n'a pas encore de capacité de fenêtrage, la réponse de rexem est la meilleure. Rexem, c'est une bonne technique mysql (JOIN (SELECT @rownum: = 0)) là, et afaik MSSQL et PostgreSQL ne supportent pas la variable déclarée implicitement, kudos! :-)
Transpose +1 vers le côté droit, puis placez-le -1. donc il ne donnera pas d'analyse de table. mysql ne peut pas avoir d'index sur l'expression –
C'est tout! Merci beaucoup! – Kuyenda
Si vous utilisez 'CASE WHERE xt.id IS NULL OU xt.val! = X.val' alors le SQL ne se cassera pas lorsque val est intentionnellement NULL, mais il capture toujours la première comparaison de décalage. – Kuyenda