2011-03-28 9 views
9

¿Hay alguna manera en SQL de agregar secuencialmente un número de fila por el grupo de claves?Número secuencialmente filas por grupo clave en SQL?

Suponga una tabla con tuplas arbitrarias (CÓDIGO, NOMBRE). tabla Ejemplo:

CODE NAME  
---- ---- 
A Apple 
A Angel 
A Arizona 
B Bravo 
C Charlie 
C Cat 
D Dog 
D Doppler 
D Data 
D Down 

proyección deseada utilizando el código como el atributo de agrupación:

CODE C_NO NAME  
---- ---- ---- 
A 0 Apple 
A 1 Angel 
A 2 Arizona 
B 0 Bravo 
C 1 Charlie 
C 0 Cat 
D 0 Dog 
D 1 Data 
D 2 Down 
D 3 Doppler 

Gracias,

Respuesta

25

MySQL does not AFAIK. Esto cubre la mayoría de las bases ..

SELECT 
    CODE, 
    ROW_NUMBER() OVER (PARTITION BY CODE ORDER BY NAME) - 1 As C_NO, 
    NAME 
FROM 
    MyTable 
+0

Me preguntaba si esto podría ser agnóstico, pero está en Oracle. – Xailor

3

MySQL (y probablemente la mayoría de otras bases de datos):

select g.CODE 
    , count(*)-1 as C_NO 
    , g.NAME 
from MyTable as g 
    left join MyTable as o 
    on g.CODE = o.CODE 
     and g.NAME >= o.NAME 
group by g.CODE 
     , g.NAME; 

específica a MySQL:

DELIMITER $$ 
CREATE PROCEDURE NumberRowsByGroup() 
BEGIN 
    SET @code := 0; 
    SET @num := 0; 
    SELECT CODE, C_NO, NAME FROM 
    (select q.CODE 
      , q.NAME 
      , @num := IF(q.CODE = @code, @num + 1, 0) as C_NO 
      , @code := q.CODE as previous 
     from yourTable q 
     order by CODE 
      , NAME 
    ) as p 
    ; 
END$$ 
DELIMITER ; 

Entonces, podemos llamar:

CALL NumberRowsByGroup(); 

Según la publicación xaprb.com/blog: how-to-number-rows-in-mysql, la segunda es más rápida.

+0

La primera solución no es necesaria en otros RDBMS que tienen funciones de ventana – gbn