Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL - Obtenir un compteur pour chaque valeur en double

Malheureusement, MySQL n'a pas de fonctions de fenêtrage, ce dont vous aurez besoin. Vous devrez donc utiliser quelque chose comme ceci :

Requête 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

voir SQL Fiddle avec démo

Explication :

Tout d'abord, sélection interne, cela applique un faux row_number à tous les enregistrements de votre table (Voir SQL Fiddle with Demo ):

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

Deuxième partie de la requête, compare chaque ligne de votre tableau à la suivante pour voir si elle a la même valeur, si ce n'est pas le cas, commencez le group_row_number sur (voir SQL Fiddle avec démo ):

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 dernière sélection renvoie les valeurs souhaitées et les replace dans l'ordre que vous avez demandé :

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