Agregar una identificación generada automáticamente para registrar en los resultados
Frecuentes
Visto 135 veces
5
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?
2 Respuestas
6
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
5
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 sql sql-server or haz tu propia pregunta.
Estoy trabajando en el Explorador de datos, por lo que supongo que MS SQL normal: Yossale