sql >> Base de Datos >  >> RDS >> Mysql

MySQL:obtenga un contador para cada valor duplicado

Desafortunadamente, MySQL no tiene funciones de ventana, que es lo que necesitará. Así que tendrás que usar algo como esto:

Consulta final

select data, group_row_number, overall_row_num
from
(
  select data,
        @num := if(@data = `data`, @num + 1, 1) as group_row_number,
        @data := `data` as dummy, overall_row_num
  from
  (
    select data, @rn:[email protected]+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by data, overall_row_num
) x
order by overall_row_num

consulte SQL Fiddle con demostración

Explicación:

Primero, selección interna, esto aplica un row_number simulado a todos los registros de su tabla (consulte SQL Fiddle with Demo ):

select data, @rn:[email protected]+1 overall_row_num
from yourtable, (SELECT @rn:=0) r

La segunda parte de la consulta, compara cada fila en su tabla con la siguiente para ver si tiene el mismo valor, si no lo tiene, entonces inicie el group_row_number terminado (consulte SQL Fiddle con demostración ):

select data,
      @num := if(@data = `data`, @num + 1, 1) as group_row_number,
      @data := `data` as dummy, overall_row_num
from
(
  select data, @rn:[email protected]+1 overall_row_num
  from yourtable, (SELECT @rn:=0) r
) x
order by data, overall_row_num

La última selección, devuelve los valores que desea y los vuelve a colocar en el orden que solicitó:

select data, group_row_number, overall_row_num
from
(
  select data,
        @num := if(@data = `data`, @num + 1, 1) as group_row_number,
        @data := `data` as dummy, overall_row_num
  from
  (
    select data, @rn:[email protected]+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by data, overall_row_num
) x
order by overall_row_num