2012-02-07 12 views
5

Estoy tratando de obtener el número de filas por cada subsecuencia.Selección del número de registros secuenciales

La tabla inicial podría tener este aspecto:

+----+-------------+ 
| id | value  | 
+----+-------------+ 
| 1 | a   | 
| 2 | b   | 
| 3 | b   | 
| 4 | c   | 
| 5 | a   | 
| 6 | a   | 
| 7 | a   | 
| 8 | a   | 
| 9 | c   | 
| 10| c   | 
+----+-------------+ 

La consulta debe devolver el número de elementos para cada secuencia de valores:

+----+-------------+ 
| value | count | 
+----+-------------+ 
| a | 1  | 
| b | 2  | 
| c | 1  | 
| a | 4  | 
| c | 2  | 
+-------+----------+ 

Hasta ahora no han sido capaces de llegar con una solución, al menos no lo suficientemente rápido para mesas grandes. Lo ideal sería una declaración de "grupo por" que no estropee el orden de los registros.

+2

Esto se denomina codificación de longitud de ejecución. –

+0

Duplicado de http://stackoverflow.com/questions/9172006/how-to-combine-near-same-item-by-sql – flesk

Respuesta

2
SELECT value, count(*) FROM (
    SELECT value, 
    (CASE WHEN @v != value THEN @i:[email protected]+1 ELSE @i END) gid, 
    @v := value FROM myTable, (SELECT @v:='', @i := 0) vars 
) tbl 
GROUP BY gid 
+0

Creo que esto es MUY CERCA ... Lo único. En el cambio de cada registro DESPUÉS del primero, el @i será el recuento que comenzará el siguiente ciclo. Cambiaría tu ELSE a ELSE @i: = 1 ... para indicar que se restablece a 1 como el comienzo de la nueva identificación que acaba de entrar. – DRapp

+0

@DRapp: ¿Lo has intentado? Creo que funciona como OP quiere como es, y que su sugerencia lo rompería. Necesita un contador en constante aumento, o agrupará valores iguales separados por grupos de valores diferentes. – flesk

+0

está en lo correcto ... lo perdió, y su COUNT es el contador real donde su valor "i" es la ruptura de fuerza entre cada cambio cíclico entre valores ... malinterpretó su variable "i" – DRapp

Cuestiones relacionadas