sql - over - ¿Cómo uso ROW_NUMBER()?
row_number() sql server (9)
Aunque estoy de acuerdo con otros en que puedes usar count()
para obtener el número total de filas, aquí puedes usar row_count()
:
Para obtener el número total de filas:
with temp as ( select row_number() over (order by id) as rownum from table_name ) select max(rownum) from temp
Para obtener los números de fila donde el nombre es Matt:
with temp as ( select name, row_number() over (order by id) as rownum from table_name ) select rownum from temp where name like ''Matt''
Puedes usar min(rownum)
o max(rownum)
para obtener la primera o la última fila para Matt respectivamente.
Estas fueron implementaciones muy simples de row_number()
. Puede usarlo para agrupaciones más complejas. Mira mi respuesta en la Agrupación avanzada sin usar una sub consulta
Quiero usar ROW_NUMBER()
para obtener ...
- Para obtener el
max(ROW_NUMBER())
-> O supongo que este también sería el recuento de todas las filas
Intenté hacer:
SELECT max(ROW_NUMBER() OVER(ORDER BY UserId)) FROM Users
pero no pareció funcionar ...
- Para obtener
ROW_NUMBER()
utilizando una determinada información, es decir. si tengo un nombre y quiero saber de qué fila proviene el nombre.
Supongo que sería algo similar a lo que probé para # 1
SELECT ROW_NUMBER() OVER(ORDER BY UserId) From Users WHERE UserName=''Joe''
pero esto tampoco funcionó ...
¿Algunas ideas?
Para la primera pregunta, ¿por qué no solo usar?
SELECT COUNT(*) FROM myTable
para obtener el conteo.
Y para la segunda pregunta, la clave principal de la fila es qué se debe usar para identificar una fila en particular. No intentes usar el número de fila para eso.
Si devolvió Row_Number () en su consulta principal,
SELECT ROW_NUMBER() OVER (Order by Id) AS RowNumber, Field1, Field2, Field3
FROM User
Luego, cuando quiera ir 5 filas hacia atrás, puede tomar el número de fila actual y usar la siguiente consulta para determinar la fila con currentrow -5
SELECT us.Id
FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) AS Row, Id
FROM User ) us
WHERE Row = CurrentRow - 5
Puede no estar relacionado con la pregunta aquí. Pero encontré que podría ser útil al usar el número de fila -
SELECT *, ROW_NUMBER () OVER (ORDER BY (SELECCIONAR 100)) COMO Any_ID FROM #Any_Table
Puede usar Row_Number
para el resultado de consulta límite.
Ejemplo:
SELECT * FROM (
select row_number() OVER (order by createtime desc) AS ROWINDEX,*
from TABLENAME ) TB
WHERE TB.ROWINDEX between 0 and 10
- Con la consulta anterior, obtendré la PÁGINA 1 de los resultados de TABLENAME
.
Si desea usar ROW_NUMBER para esto (en lugar de count (*)) siempre puede usar:
SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY Id)
FROM USERS
ORDER BY ROW_NUMBER() OVER (ORDER BY Id) DESC
Si necesita devolver el recuento total de filas de la tabla, puede usar una forma alternativa a la SELECT COUNT(*)
.
Como SELECT COUNT(*)
realiza un escaneo completo de la tabla para devolver el recuento de filas, puede tomar mucho tiempo para una tabla grande. En este caso, puede usar la tabla del sistema sysindexes
. Hay una columna ROWS
que contiene el recuento total de filas para cada tabla en su base de datos. Puede usar la siguiente instrucción select:
SELECT rows FROM sysindexes WHERE id = OBJECT_ID(''table_name'') AND indid < 2
Esto reducirá drásticamente el tiempo que tarda su consulta.
Tomando su encabezado literal, aquí hay una entrada de blog que explica las llamadas funciones de ventana (donde row_number es una de ellas):
http://www.depesz.com/index.php/2009/01/21/waiting-for-84-window-functions/
ROW_NUMBER()
devuelve un número único para cada fila que comienza con 1. Puede usar esto simplemente escribiendo:
ROW_NUMBER() OVER (ORDER BY ''Column_Name'' DESC) as ROW_NUMBER
Puede encontrar la diferencia entre Row_number()
, Rank()
y Dense_Rank()
here .
SELECT num, UserName FROM
(SELECT UserName, ROW_NUMBER() OVER(ORDER BY UserId) AS num
From Users) AS numbered
WHERE UserName=''Joe''