Niestety, MySQL nie posiada funkcji okienkowych, których będziesz potrzebować. Więc będziesz musiał użyć czegoś takiego:
Ostateczne zapytanie
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
zobacz SQL Fiddle z wersją demonstracyjną
Wyjaśnienie:
Po pierwsze, wewnętrzne zaznaczenie, stosuje udany row_number
do wszystkich rekordów w Twojej tabeli (Zobacz SQL Fiddle z wersją demonstracyjną
):
select data, @rn:[email protected]+1 overall_row_num
from yourtable, (SELECT @rn:=0) r
Druga część zapytania, porównuje każdy wiersz w Twojej tabeli z następnym, aby sprawdzić, czy ma on tę samą wartość, jeśli nie, to rozpoczyna group_row_number
over (patrz SQL Fiddle z wersją demonstracyjną
):
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
Ostatni wybór zwraca żądane wartości i umieszcza je z powrotem w żądanej kolejności:
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