Agregar una identificación generada automáticamente para registrar en los resultados

Necesito agregar una identificación de incremento automático generada automáticamente a los resultados de una consulta. Por ejemplo, para la consulta

SELECT TOP 3 Users.Reputation FROM Users ORDER BY 1 DESC

En lugar de conseguir

  • 101
  • 100
  • 99

Quiero tener

  • 1, 101
  • 2, 100
  • 3, 99

¿Cómo puedo hacerlo?

preguntado el 25 de agosto de 12 a las 16:08

Estoy trabajando en el Explorador de datos, por lo que supongo que MS SQL normal:

2 Respuestas

La forma más fácil si es un SQL Server, entonces esta:

SELECT TOP 3 
ROW_NUMBER() OVER(ORDER BY Users.Reputation DESC), 
Users.Reputation 
FROM Users

Actualizar:

Verifiqué el plan de ejecución de consultas y el orden interno por, que define el orden lógico de las filas dentro de cada partición del conjunto de resultados (no usé una condición de partición específica en este caso) usando un paso Ordenar, que es lo mismo como por un tipo normal:

SELECT Users.Reputation
FROM Users
ORDER BY Users.Reputation DESC

Después de este paso hay dos pasos interesantes: Segmento y Proyecto de Secuencia. El segundo dice que es un cálculo sobre un ordenado conjunto de datos Los últimos pasos son un TOP y un SELECT.

Estoy interesado en los inconvenientes, pero parece estar bien.

Y solo una nota al final: con un OrderBy normal con TOP:

 SELECT TOP 3 Users.Reputation
    FROM Users
    ORDER BY Users.Reputation DESC

La clasificación es más fácil, pero casi igual: Ordenar (Ordenar N superior)

Respondido 25 ago 12, 19:08

Qué tal si:

;WITH CTE AS 
(SELECT
    RowNum = ROW_NUMBER() OVER(ORDER BY Reputation DESC),
    Users.Reputation
 FROM
    Users
)
SELECT TOP 3
    RowNum, Reputation
FROM
    CTE
ORDER BY  
    RowNum

Esta es una CTE (expresión de tabla común) disponible en SQL Server 2005 y más nuevos, combinados con el ROW_NUMBER() función de clasificación, también disponible en 2005 y posteriores.

Crea una vista "sobre la marcha" solo para la siguiente declaración y permite realizar un procesamiento adicional primero, antes de seleccionar. los ROW_NUMBER() simplemente agrega un número consecutivo a cada fila en el orden definido en el OVER (ORDER BY ....) cláusula. Entonces, la primera fila obtiene el número 1, la segunda el número 2 y así sucesivamente.

Lea más sobre los CTE aquí: MSDN - Uso de expresiones de tabla comunes

Lea más sobre ROW_NUMBER y otras funciones de clasificación aquí: MSDN ROW_NUMBER

Respondido 25 ago 12, 16:08

¿Podrías explicar un poco más sobre esta solución? - Yossale

Curioso por saber si esto es > MSSQL 2005 solución o funciona siempre? - víkdor

@Vikdor: funciona en la mayoría de los DBMS modernos (aunque otros DBMS necesitan el terminador de declaración al final, no al principio). - un caballo sin nombre

¿Es un poco exagerado, o no? Una simple selección podría hacer eso con solo una cláusula OVER(Oder BY...).) - András Otto

@AndrásOttó: intenta agregar un ORDER BY por ese número de fila a su solución! :-) Me resulta más fácil envolver todo en un CTE y luego poder usar las columnas definidas por el CTE por nombre - marc_s

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.