2012-08-01 10 views
6

tengo los siguientes datos en la tablaOracle SQL asignar números consecutivos a un subconjunto basado en la columna valores

 
ID_1 ID_2 SEQ GROUP 
212648 601327 1 
212648 1805 2 
212648 500886 3 
212648 3405 4 
212648 501174 5 
212648 201245 6 
212648 500449 7 
212648 3804 8 
212648 501533 9 
212648 3989 10 
212648 500280 11 START 
212648 175  12 BETWEEN 
212648 500395 13 END 
212648 1817 14 
212648 500945 15 START 
212648 183  16 BETWEEN 
212648 500543 17 BETWEEN 
212648 181  18 BETWEEN 
212648 500009 19 END 
212648 5576 20 
212648 500960 21 
212648 5562 22 
212648 603659 23 

Me gustaría añadir una columna que se aplicará un nombre de grupo para las filas entre 'START" y 'FIN' Por ejemplo:.

 
ID_1 ID_2 SEQ GROUP GROUP_SEQ 
212648 601327 1  
212648 1805 2  
212648 500886 3  
212648 3405 4  
212648 501174 5  
212648 201245 6  
212648 500449 7  
212648 3804 8  
212648 501533 9  
212648 3989 10  
212648 500280 11 START 1 
212648 175  12 BETWEEN 1 
212648 500395 13 END  1 
212648 1817 14  
212648 500945 15 START 2 
212648 183  16 BETWEEN 2 
212648 500543 17 BETWEEN 2 
212648 181  18 BETWEEN 2 
212648 500009 19 END  2 
212648 5576 20  
212648 500960 21  
212648 5562 22  
212648 603659 23  

que buscan en las funciones analíticas de Oracle (RANK(), primero, último(), etc.), pero no pude encontrar una solución Gracias de antemano por cualquier. respuestas

+1

Corrija si soy incorrecto pero no puede normalizar la tabla y evitar esto? –

+0

Los valores de columna SEQ y GROUP son valores calculados de subselects. Reduje el tamaño de la mesa para presentar el problema. ¿En qué normalización estabas pensando? – chipix

+0

La segunda forma normal indica que todas las columnas que no son clave dependen funcionalmente de la clave primaria completa. –

Respuesta

5

En la parte superior, esta consulta obtuvo el resultado. Probablemente una manera más limpia si se gasta un poco más de tiempo en ello.

SELECT id_1, id_2, seq, the_group 

     ,CASE WHEN (start_count - end_count) > 0 OR (start_count = end_count AND the_group = 'END') 
      THEN start_count 
      ELSE NULL 
     END AS group_seq 

    FROM (SELECT id_1, id_2, seq, the_group 

       ,SUM(CASE WHEN the_group = 'START' THEN 1 ELSE 0 END) 
        OVER(PARTITION BY ID_1 ORDER BY id_1, SEQ) AS start_count 

       ,SUM(CASE WHEN the_group = 'END' THEN 1 ELSE 0 END) 
        OVER(PARTITION BY ID_1 ORDER BY id_1, SEQ) AS end_count 

      FROM myTable) 

    ORDER BY id_1, seq 
+0

La consulta anterior resolvió el problema y no parece tener problemas de rendimiento. Muy buen truco. Gracias. – chipix

Cuestiones relacionadas