row_number registros numero numerar generar filas fila ejemplos contar contador consultas consecutivo agrupados agrupadas sql mysql

registros - Técnica de SQL puro para filas de numeración automática en el conjunto de resultados



row_number sql server 2008 ejemplos (9)

AFAIK, no hay una forma "estándar".

MS SQL Server tiene row_number (), que MySQL no tiene.

La forma más sencilla de hacer esto en MySQL es

SELECT a.*, @num := @num + 1 b from test a, (SELECT @num := 0) d;

Fuente: comentarios en http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/

Estoy buscando una forma de numerar secuencialmente las filas en un conjunto de resultados (no una tabla). En esencia, estoy empezando con una consulta como la siguiente:

SELECT id, name FROM people WHERE name = ''Spiewak''

Los id obviamente no son una secuencia verdadera (ej. 1, 2, 3, 4 ). Lo que necesito es otra columna en el conjunto de resultados que contenga estas numeraciones automáticas. Estoy dispuesto a usar una función de SQL si es necesario, pero preferiría hacerlo sin usar extensiones en las especificaciones de ANSI.

La plataforma es MySQL, pero la técnica debe ser multiplataforma si es posible (de ahí el deseo de evitar extensiones no estándar).



No existe una forma estándar de ANSI para hacer esto de la que tengo conocimiento.

En SQL Server, tiene una función ROW_NUMBER () que se puede usar y, en Oracle, hay una pseudocolumna ROWNUM.

En MySQL, existe esta técnica


Para el servidor SQL, consulte la función RANK.


Para tener un número de fila significativo, necesita ordenar sus resultados. Entonces puedes hacer algo como esto:

SELECT id, name , (SELECT COUNT(*) FROM people p2 WHERE name=''Spiewak'' AND p2.id <= p1.id) AS RowNumber FROM people p1 WHERE name = ''Spiewak'' ORDER BY id

Tenga en cuenta que la cláusula WHERE de la consulta secundaria debe coincidir con la cláusula WHERE o la clave principal de la consulta principal y el ORDER BY de la consulta principal.

SQL Server tiene la construcción ROW_NUMBER () OVER para simplificar esto, pero no sé si MySQL tiene algo especial para abordarlo.

Dado que mi publicación aquí fue aceptada como la respuesta, también deseo mencionar la respuesta de Dan Goldstein, que es muy similar en cuanto a su enfoque, pero usa una JOIN en lugar de una sub consulta y con frecuencia tendrá un mejor rendimiento.


SELECT @i:=@i+1 AS iterator, t.* FROM tablename t,(SELECT @i:=0) foo


En Oracle, la única base de datos que sé lo que desea hacer es hacer una selección secundaria en los datos

es decir

select rownum, id , blah, blah from ( select id, name FROM people WHERE name = ''Spiewak'' )

el concepto básico es que el rownum se evaluará en el conjunto de resultados devuelto por la selección interna.

Espero que esto te indique una solución que puedas usar.


Sé que este es un hilo viejo, pero recién ahora estaba buscando esta respuesta. Probé la consulta de Dan Goldstein en MySQL, pero no funcionó como estaba escrito porque ''exterior'' es una palabra reservada. Luego, noté que todavía está usando una subconsulta, de todos modos.

Entonces, descubrí una versión usando JOIN, pero SIN subconsulta:

SELECT SUM(IF(p1.id > p2.id, 0, 1)) AS `row`, p2.id, p2.name FROM people p1 JOIN people p2 ON p1.name = p2.name WHERE p1.name = ''Spiewak'' GROUP BY p2.id

Esto funcionó para mí en MySQL 5.1. Para MySQL, parece ser suficiente para GROUP BY p2.id. Se puede agregar un ORDER BY p2.id explícito al final de la consulta, pero obtuve los mismos resultados, de cualquier manera.


Una idea que es bastante ineficiente pero es ANSI SQL sería contar el número de filas con una identificación menor que coincida con los mismos criterios. No he probado este SQL y probablemente no funcionará, pero algo como:

SELECT id, name, sub.lcount FROM people outer JOIN (SELECT id, COUNT(id) lcount FROM people WHERE name = ''Spiewak'' AND id < outer.id GROUP BY id) sub on outer.id = sub.id WHERE name = ''Spiewak''