Hola lectores,
¡Buen día!

Recientemente tuve la necesidad de crear una clasificación en MySQL similar a ROW_NUMBER() de SQL Server. Desafortunadamente, Oracle aún no ha implementado esta característica tan útil, pero como todo funciona, les mostraré cómo podemos implementarla.

Una forma muy sencilla de hacer esto es crear una tabla e incluir un campo de incremento automático, como el siguiente ejemplo:

DROP TABLE IF EXISTS `teste`;

CREATE TABLE `teste`(  
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `nome` VARCHAR(50) NOT NULL,
  `idade` INT(11) UNSIGNED NOT NULL,
  PRIMARY KEY (`id`)
);

De esta forma, cada línea tendrá su propio ID incremental, que podrá utilizarse como Ranking.

El problema es cuando necesitamos crear consultas un poco más complejas usando combinaciones y filtros y necesitamos crear una clasificación en esa consulta. ¿Podemos crear una tabla y almacenar el resultado de esta consulta en la tabla mediante incremento automático?
Sí, pero es una opción muy laboriosa, especialmente si se devuelven muchas columnas en la consulta.

Completar datos para que nuestra tabla siga la siguiente estructura:

id      nome              idade  
------  ----------------  --------
     1  João Zebedeu            27
     2  Pedro                   32
     3  Mateus                  15
     4  Judas Tadeu             29
     5  André                   64
     6  Tomé                    60
     7  Filipe                  25
     8  Bartolomeu              47
     9  Tiago                   28
    10  Tiago                   33
    11  Judas Iscariotes       666
    12  Simão                   39

INSERT INTO `teste` (nome, idade)
VALUES('João Zebedeu', 27),
('Pedro', 32),
('Mateus', 15),
('Judas Tadeu', 29),
('André', 64),
('Tomé', 60),
('Filipe', 25),
('Bartolomeu', 47),
('Tiago', 28),
('Tiago', 33),
('Judas Iscariotes', 666),
('Simão', 39);

Podemos satisfacer nuestras necesidades creando la consulta de la siguiente manera:

SELECT 
    id,
    nome,
    idade,
    @curRank := @curRank + 1 AS rank 
FROM
    teste p,
    (SELECT @curRank := 0) r 
ORDER BY 
    idade;

Y esta es la devolución:

id      nome              idade   rank  
------  ----------------  ------  --------
     3  Mateus                15         1
     7  Filipe                25         2
     1  João Zebedeu          27         3
     9  Tiago                 28         4
     4  Judas Tadeu           29         5
     2  Pedro                 32         6
    10  Tiago                 33         7
    12  Simão                 39         8
     8  Bartolomeu            47         9
     6  Tomé                  60        10
     5  André                 64        11
    11  Judas Iscariotes     666        12

¡Exactamente lo que necesitaba!

¡Hasta la próxima!