残念ながら、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 withDemo を参照してください。
説明:
まず、内部選択。これにより、模擬のrow_number
が適用されます。 テーブル内のすべてのレコードに( SQL Fiddle with Demo
を参照) ):
select data, @rn:[email protected]+1 overall_row_num
from yourtable, (SELECT @rn:=0) r
クエリの2番目の部分では、テーブル内の各行を次の行と比較して、同じ値であるかどうかを確認します。同じ値でない場合は、group_row_number
を開始します。 以上( SQL Fiddle withDemo
を参照してください。 ):
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