sql-server - seleccionar - ocultar columna en consulta mysql
¿Cómo selecciono las últimas 5 filas en una tabla sin ordenar? (20)
Quiero seleccionar los últimos 5 registros de una tabla en SQL Server sin organizar la tabla en orden ascendente o descendente.
- Necesita contar el número de filas dentro de la tabla (digamos que tenemos 12 filas)
- luego resta 5 filas de ellos (ahora estamos en 7)
seleccione * donde index_column> 7
select * from users where user_id > ( (select COUNT(*) from users) - 5)
puedes ordenarlos ASC o DESC
Pero al usar este código
select TOP 5 from users order by user_id DESC
no se ordenará fácilmente.
Bueno, las "últimas cinco filas" son en realidad las últimas cinco filas dependiendo de su índice agrupado. Su índice agrupado, por definición, es la forma en que las filas están ordenadas. Entonces realmente no puedes obtener las "últimas cinco filas" sin algún orden. Sin embargo, puede obtener las últimas cinco filas en lo que respecta al índice agrupado.
SELECT TOP 5 * FROM MyTable
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC
Busca 5 registros de los últimos registros que puedas usar,
SELECT *
FROM Table Name
WHERE ID <= IDENT_CURRENT(''Table Name'')
AND ID >= IDENT_CURRENT(''Table Name'') - 5
Cuando el número de filas en la tabla es inferior a 5, las respuestas de Matt Hamilton y msuvajac son incorrectas. Debido a que un valor de recuento de filas TOP N puede no ser negativo.
Un gran ejemplo se puede encontrar Here .
En SQL Server 2012 puedes hacer esto:
Declare @Count1 int ;
Select @Count1 = Count(*)
FROM [Log] AS L
SELECT
*
FROM [Log] AS L
ORDER BY L.id
OFFSET @Count - 5 ROWS
FETCH NEXT 5 ROWS ONLY;
Esta es casi la pregunta más extraña que he escrito, pero estoy bastante seguro de que obtiene las "últimas 5" filas de una tabla sin ordenar:
select *
from issues
where issueid not in (
select top (
(select count(*) from issues) - 5
) issueid
from issues
)
Tenga en cuenta que esto hace uso de la capacidad de SQL Server 2005 para pasar un valor a la cláusula "superior", no funciona en SQL Server 2000.
Gracias a @Apps Tawale , en base a su respuesta , aquí hay un poco de otra (mi) versión,
Para seleccionar los últimos 5 registros sin una columna de identidad,
select top 5 *,
RowNum = row_number() OVER (ORDER BY (SELECT 0))
from [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc
Sin embargo, tiene un orden por, pero en RowNum :)
Nota (1) : la consulta anterior invertirá el orden de lo que obtenemos cuando ejecutamos la consulta de selección principal.
Para mantener el orden, podemos decir algo así:
select *, RowNum2 = row_number() OVER (ORDER BY (SELECT 0))
from (
select top 5 *, RowNum = row_number() OVER (ORDER BY (SELECT 0))
from [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc
) as t1
order by RowNum2 desc
Nota (2): sin una columna de identidad, la consulta toma un poco de tiempo en caso de datos de gran tamaño
Hay un truco útil que funciona en algunas bases de datos para ordenar en orden de bases de datos,
SELECT * FROM TableName ORDER BY true
Aparentemente, esto puede funcionar junto con cualquiera de las otras sugerencias publicadas aquí para dejar los resultados en el orden "orden en que salieron de la base de datos", que en algunas bases de datos es el orden en el que se modificaron por última vez.
La forma en que se formula su pregunta hace que suene como si pensara que tiene que recurrir físicamente a los datos de la tabla para volver a ponerlos en el orden que desee. Si es así, este no es el caso, la cláusula ORDER BY existe para este propósito. El orden físico en el que se almacenan los registros permanece sin cambios cuando se usa ORDER BY. Los registros se ordenan en la memoria (o en el espacio temporal en disco) antes de que se devuelvan.
Tenga en cuenta que el orden en que se devuelven los registros no está garantizado sin utilizar una cláusula ORDER BY. Entonces, si bien algunas de las sugerencias aquí pueden funcionar, no hay ninguna razón para pensar que continuarán funcionando, ni puede probar que funcionan en todos los casos con su base de datos actual. Esto es por diseño, supongo que es para dar libertad al motor de la base de datos con los registros para obtener el mejor rendimiento en el caso de que no se especifique una orden explícita.
Suponiendo que quiere los últimos 5 registros ordenados por el campo Nombre en orden ascendente, podría hacer algo como esto, que debería funcionar en SQL 2000 o 2005:
select Name
from (
select top 5 Name
from MyTable
order by Name desc
) a
order by Name asc
Las últimas 5 filas se recuperan en mysql
Esta consulta funciona perfectamente
SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC
o
select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc
Obtenga el conteo de esa mesa
select count(*) from TABLE
select top count * from TABLE where ''primary key row'' NOT IN (select top (count-5) ''primary key row'' from TABLE)
Pruebe esto, si no tiene una clave principal o una columna idéntica:
select [Stu_Id],[Student_Name] ,[City] ,[Registered],
RowNum = row_number() OVER (ORDER BY (SELECT 0))
from student
ORDER BY RowNum desc
Puedes recuperarlos de la memoria.
Entonces, primero obtiene las filas en un DataSet y luego saca las últimas 5 del DataSet.
Si sabe cuántas filas habrá en total, puede usar la función ROW_NUMBER (). Aquí hay un examble de MSDN ( http://msdn.microsoft.com/en-us/library/ms186734.aspx )
USE AdventureWorks;
GO
WITH OrderedOrders AS
(
SELECT SalesOrderID, OrderDate,
ROW_NUMBER() OVER (ORDER BY OrderDate) AS ''RowNumber''
FROM Sales.SalesOrderHeader
)
SELECT *
FROM OrderedOrders
WHERE RowNumber BETWEEN 50 AND 60;
Sin una orden, esto es imposible. ¿Qué define el "fondo"? Lo siguiente seleccionará 5 filas de acuerdo a cómo se almacenan en la base de datos.
SELECT TOP 5 * FROM [TableName]
Supongamos que tiene un índice en la identificación, esto será muy rápido:
SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable])
estoy usando este código:
select * from tweets where placeID = ''$placeID'' and id > (
(select count(*) from tweets where placeID = ''$placeID'')-2)
DECLARE @MYVAR NVARCHAR(100)
DECLARE @step int
SET @step = 0;
DECLARE MYTESTCURSOR CURSOR
DYNAMIC
FOR
SELECT col FROM [dbo].[table]
OPEN MYTESTCURSOR
FETCH LAST FROM MYTESTCURSOR INTO @MYVAR
print @MYVAR;
WHILE @step < 10
BEGIN
FETCH PRIOR FROM MYTESTCURSOR INTO @MYVAR
print @MYVAR;
SET @step = @step + 1;
END
CLOSE MYTESTCURSOR
DEALLOCATE MYTESTCURSOR
select *
from table
order by empno(primary key) desc
fetch first 5 rows only
select * from table limit 5 offset (select count(*) from table) - 5;