Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:ottieni un contatore per ogni valore duplicato

Sfortunatamente, MySQL non ha funzioni di windowing che è ciò di cui avrai bisogno. Quindi dovrai usare qualcosa del genere:

Richiesta finale

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

vedi SQL Fiddle con demo

Spiegazione:

Innanzitutto, selezione interna, questo applica un falso row_number a tutti i record nella tabella (consulta SQL Fiddle with Demo ):

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

Seconda parte della query, confronta ogni riga della tabella con quella successiva per vedere se ha lo stesso valore, in caso contrario avvia il group_row_number oltre (vedi 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

L'ultima selezione restituisce i valori desiderati e li ricolloca nell'ordine richiesto:

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