За съжаление MySQL няма функции за прозорци, което е това, от което се нуждаете. Така че ще трябва да използвате нещо подобно:
Окончателна заявка
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
вижте SQL Fiddle с демонстрация
Обяснение:
Първо, вътрешен избор, това прилага макет row_number
към всички записи във вашата таблица (Вижте SQL Fiddle с демонстрация
):
select data, @rn:[email protected]+1 overall_row_num
from yourtable, (SELECT @rn:=0) r
Втората част на заявката сравнява всеки ред във вашата таблица със следващия, за да види дали има същата стойност, ако не, тогава стартира group_row_number
над (вижте SQL Fiddle с демонстрация
):
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
Последният избор връща желаните от вас стойности и ги поставя обратно в реда, който сте поискали:
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