MySQL bohužel nemá funkce pro vytváření oken, což je to, co budete potřebovat. Takže budete muset použít něco takového:
Konečný dotaz
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
Vysvětlení:
Za prvé, vnitřní výběr, použije se falešné row_number
na všechny záznamy ve vaší tabulce (viz SQL Fiddle s ukázkou
):
select data, @rn:[email protected]+1 overall_row_num
from yourtable, (SELECT @rn:=0) r
Druhá část dotazu porovnává každý řádek v tabulce s dalším, aby se zjistilo, zda má stejnou hodnotu, pokud ne, pak začíná group_row_number
přes (viz SQL Fiddle s ukázkou
):
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
Poslední výběr vrátí požadované hodnoty a vrátí je zpět v požadovaném pořadí:
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