Avant l'introduction des expressions de table communes dans MySQL 8, la première méthode de GL était la plus rapide, mais voici quelques autres idées (utilisant également une technologie plus ancienne), juste pour le plaisir...
1.
SELECT x.*
, COUNT(*) rank
FROM my_table x
JOIN my_table y
ON y.a = x.a
AND y.b <= x.b
GROUP
BY x.a
, x.b;
2.
SELECT x.*
, FIND_IN_SET(b,n) rank
FROM my_table x
JOIN
( SELECT a
, GROUP_CONCAT(b ORDER BY b) n
FROM my_table
GROUP
BY a
) y
ON y.a = x.a;