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