この問題を解決する場合、ユーザー定義変数が便利になります。これは機能するはずです:
select g, x, counter from (
select g, x,
@counter := if (g = @prev_g, @counter + 1, 1) counter,
@prev_g := g
from tb, (select @counter := 0, @prev_g := null) init
order by g, x
) s
4番目の列を気にしない場合は、外側の選択を安全に削除できます。これにより、パフォーマンスが大幅に向上します。