2012-03-20 12 views
6

La idea es que digamos que tiene la siguiente tabla.SQL GROUP BY: intervalos en continuidad?

------------- 
| oID | Area| 
------------- 
| 1 | 5  | 
| 2 | 2  | 
| 3 | 3  | 
| 5 | 3  | 
| 6 | 4  | 
| 7 | 5  | 
------------- 

Si agrupación por continuidad es posible este seudo consulta

SELECT SUM(Area) FROM sample_table GROUP BY CONTINUITY(oID) 

volvería

------------- 
| SUM(Area) | 
------------- 
| 10  | 
| 12  | 
------------- 

Cuando la ruptura de continuidad surge en OID o más bien la falta de ella una entrada que representa OID 4.

¿Existe tal funcionalidad dentro de las funciones estándar de Sql?

Respuesta

5

No existe tal funcionalidad en "funciones estándar de SQL", pero es posible obtener el resultado deseado mediante el uso de algunos trucos.

Con la subconsulta que se ilustra a continuación, creamos un campo virtual que puede usar para GROUP BY en la consulta externa. El valor de este campo virtual se incrementa cada vez que hay un espacio en la secuencia de oID. De esta manera se crea un identificador para cada una de esas "islas de datos": tabla y los datos

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 

prueba generación:

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); 

necesito agradecer Quassnoi por señalar this trick in my related question ;-)

ACTUALIZACIÓN: tabla y datos de prueba agregados y nombre de columna duplicado fijo en la consulta de ejemplo.

0

Aquí hay una publicación de blog que proporciona una explicación muy detallada y un ejemplo relacionado con grouping by contiguous data. Si tiene algún problema para comprenderlo o implementarlo, puedo intentar proporcionar una implementación para su problema.

+0

esto también es posible sin usar tablas temporales. – Kaii