Cómo leer la última fila con SQL Server


88

¿Cuál es la forma más eficiente de leer la última fila con SQL Server?

La tabla está indexada en una clave única: los valores clave "inferiores" representan la última fila.

Respuestas:


180

Si está utilizando MS SQL, puede probar:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

17
¿Qué pasa si tienes 5 millones de registros en DB? : - \
inmersión profunda

4
Si la tabla está indexada en la columna de clasificación, SQL solo leerá la última fila de la tabla. No se necesita una clasificación costosa o un escaneo completo de la tabla.
Spivonious

Si necesito obtener los últimos 1000 registros, ¿cómo los obtengo? ¿Puedes saberlo?
Sri

1
@Sri Ejecutaría SELECT TOP 1000 * FROM table_name ORDER BY column_name DESCy debería generar los últimos 1000 registros.
Rod Argumedo


18

Necesitará algún tipo de columna de identificación única en su tabla, como una clave principal de llenado automático o una columna de fecha y hora (preferiblemente la clave principal). Entonces puedes hacer esto:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

El ORDER BY columnle dice que reacomode los resultados de acuerdo con los datos de esa columna, y DESCle dice que invierta los resultados (poniendo así el último primero). Después de eso, LIMIT 1le dice que solo pase una fila hacia atrás.


6
MSSQL no usa LIMIT
Vinko Vrsalovic

4
Vaya, dura, la pregunta original ni siquiera decía SQL Server específicamente. La solución anterior es perfectamente legítima a pesar de que SQL Server utiliza diferentes palabras para describir el mismo concepto. +1
Greg Hewgill

11

Si algunos de sus ID están en orden, supongo que habrá algún orden en su base de datos

SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)


4

Creo que la siguiente consulta funcionará para SQL Server con el máximo rendimiento sin ninguna columna ordenable

SELECT * FROM table 
WHERE ID not in (SELECT TOP (SELECT COUNT(1)-1 
                             FROM table) 
                        ID 
                 FROM table)

Espero que lo hayas entendido ... :)


Esta es la mejor solución cuando no puede ordenar DESC y solo necesita la última fila cuando se devuelve.
jjthebig1

3

Intenté usar last in sql query en SQl server 2008 pero me da este error: "'last' no es un nombre de función integrado reconocido".

Así que terminé usando:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

para obtener el Id de la última fila. También se podría usar

Declare @i int
set @i=1
select WorkflowStateStatusId from Workflow.WorkflowStateStatus
 where WorkflowStateStatusId not in (select top (
   (select count(*) from Workflow.WorkflowStateStatus) - @i ) WorkflowStateStatusId from .WorkflowStateStatus)


2

Prueba esto

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

1
Como un comentario anterior de @Vinko Vrsalovic dice que MSSQL no usa LIMIT. Esto regresaIncorrect syntax near LIMIT
frmbelz

1

Para recuperar la última fila de una tabla para la base de datos MS SQL 2005, puede utilizar la siguiente consulta:

select top 1 column_name from table_name order by column_name desc; 

Nota: Para obtener la primera fila de la tabla para la base de datos MS SQL 2005, puede utilizar la siguiente consulta:

select top 1 column_name from table_name; 

2
select top 1sin una orden por no es una forma confiable de obtener el primer registro. Si no hace un pedido por, da permiso para que SQL le proporcione cualquier registro que le plazca.
Code Magician

1

OFFSETy FETCH NEXTson una característica de SQL Server 2012 para lograr la paginación SQL mientras se muestran los resultados.

El OFFSETargumento se usa para decidir la fila inicial para devolver filas a partir de un resultado y el FETCHargumento se usa para devolver un número de filas.

SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY

0
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)

1
La mejor respuesta de manera similar, podemos obtener la primera fila SELECT * de Empleados donde [ID de empleado] = TODOS (SELECCIONAR MIN ([ID de empleado]) de Empleados)
manas

0

Así es como obtiene el último registro y actualiza un campo en Access DB.

ACTUALIZAR compalints SET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )


0

Si no tiene ninguna columna ordenada, puede usar la identificación física de cada línea:

SELECT top 1 sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot], 
              T.*
FROM MyTable As T
order by sys.fn_PhysLocFormatter(%%physloc%%) DESC

0

Si tiene una tabla replicada, puede tener Identity = 1000 en localDatabase e Identity = 2000 en clientDatabase, por lo que si detecta la última ID, puede encontrar siempre la última del cliente, no la última de la base de datos conectada actual. Entonces, el mejor método que devuelve la última base de datos conectada es:

SELECT IDENT_CURRENT('tablename')

0

Bueno, no obtengo el "último valor" en una tabla, obtengo el último valor por instrumento financiero. No es lo mismo, pero supongo que es relevante para algunos que buscan averiguar "cómo se hace ahora". También usé RowNumber () y CTE's y antes de eso simplemente tomar 1 y ordenar por [columna] desc. Sin embargo, ya no necesitamos ...

Estoy usando SQL Server 2017, estamos registrando todos los ticks en todos los intercambios a nivel mundial, tenemos ~ 12 mil millones de ticks por día, almacenamos cada Bid, ask y trade, incluidos los volúmenes y los atributos de un tick (bid, ask, trade ) de cualquiera de los intercambios dados.

Tenemos 253 tipos de datos de ticks para cualquier contrato dado (principalmente estadísticas) en esa tabla, el último precio negociado es el tipo de tick = 4, por lo que, cuando necesitamos obtener el "último" de Price, usamos:

select distinct T.contractId,
LAST_VALUE(t.Price)over(partition by t.ContractId order by created ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
from [dbo].[Tick] as T
where T.TickType=4

Puede ver el plan de ejecución en mi sistema de desarrollo, se ejecuta de manera bastante eficiente, se ejecuta en 4 segundos mientras el ETL de importación de intercambio está bombeando datos a la tabla, habrá algunos bloqueos que me ralentizarán ... así es como funcionan los sistemas en vivo. plan de ejecución contra 85,697,659 filas


-1
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)

Bienvenido al sitio. Esto podría ser un comentario (si tuviera el representante), ¿le importaría expandirlo agregando algún texto para explicar cómo resuelve el problema y para diferenciarlo de las 10 respuestas anteriores?
gung - Reincorporación a Monica el

-5

Estoy bastante seguro de que es:

SELECT last(column_name) FROM table

Porque uso algo similar:

SELECT last(id) FROM Status

7
Last () no es una función de sql-server
Taryn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.