Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL - Obtenha um contador para cada valor duplicado


Infelizmente, o MySQL não tem funções de janela que é o que você vai precisar. Então você terá que usar algo assim:

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

veja SQL Fiddle with Demo

Explicação:

Primeiro, seleção interna, isso aplica um row_number simulado para todos os registros em sua tabela (Veja SQL Fiddle with Demo ):
select data, @rn:[email protected]+1 overall_row_num
from yourtable, (SELECT @rn:=0) r

Segunda parte da consulta, compara cada linha em sua tabela com a próxima para ver se ela tem o mesmo valor, se não iniciar o group_row_number (veja SQL Fiddle with Demo ):
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

A última seleção, retorna os valores desejados e os coloca de volta na ordem solicitada:
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