Thật không may, MySQL không có các chức năng cửa sổ, đó là những gì bạn sẽ cần. Vì vậy, bạn sẽ phải sử dụng một cái gì đó như thế này:
Truy vấn cuối cùng
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
Giải thích:
Đầu tiên, lựa chọn bên trong, điều này áp dụng một row_number
giả vào tất cả các bản ghi trong bảng của bạn (Xem SQL Fiddle with Demo
):
select data, @rn:[email protected]+1 overall_row_num
from yourtable, (SELECT @rn:=0) r
Phần thứ hai của truy vấn, so sánh từng hàng trong bảng của bạn với hàng tiếp theo để xem nó có cùng giá trị hay không, nếu không thì hãy bắt đầu group_row_number
over (xem SQL Fiddle with Demo
):
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
Lựa chọn cuối cùng, trả về các giá trị bạn muốn và đặt chúng trở lại theo thứ tự bạn yêu cầu:
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