如何在没有排序的情况下选择表格中的最后5行?

时间:2008-11-22 08:00:33

标签: sql-server tsql

我想从SQL Server中的表中选择最后5条记录,而不是按升序或降序排列表。

21 个答案:

答案 0 :(得分:34)

这只是我写过的最离奇的查询,但我很确定它从表中获得了“最后5行”而没有订购:

select * 
from issues
where issueid not in (
    select top (
        (select count(*) from issues) - 5
    ) issueid
    from issues
)

请注意,这利用了SQL Server 2005将值传递给“top”子句的能力 - 它在SQL Server 2000上不起作用。

答案 1 :(得分:28)

假设你有一个关于id的索引,这将是一个快速的:

SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable])

答案 2 :(得分:10)

你的问题的表达方式使得听起来你认为你必须在表格中实际使用数据,以便按照你想要的顺序恢复它。如果是这样,则不是这种情况,为此目的存在ORDER BY子句。使用ORDER BY时,存储记录的物理顺序保持不变。记录在返回之前在内存中(或在临时磁盘空间中)进行排序。

请注意,如果不使用ORDER BY子句,则无法保证返回记录的顺序。因此,虽然这里的任何建议都可行,但没有理由认为它们会继续工作,也无法证明它们适用于当前数据库的所有情况。这是设计的 - 我假设它是为了给数据库引擎提供与记录一样的自由,以便在没有指定显式顺序的情况下获得最佳性能。

假设您希望按字段名称升序排序的最后5条记录,您可以执行类似的操作,这应该适用于SQL 2000或2005:

select Name 
from (
    select top 5 Name 
    from MyTable 
    order by Name desc
) a 
order by Name asc

答案 3 :(得分:10)

  1. 您需要计算表格内的行数(比如我们有12行)
  2. 然后从它们中减去5行(我们现在在7中)
  3. select * where index_column> 7

    select * from users
    where user_id > 
    ( (select COUNT(*) from users) - 5)
    

    您可以订购ASC或DESC

    但使用此代码时

    select TOP 5 from users order by user_id DESC
    

    不会轻易订购。

答案 4 :(得分:4)

搜索您可以使用此记录的最近记录中的5条记录,

SELECT *
FROM   Table Name
WHERE  ID <= IDENT_CURRENT('Table Name')
AND ID >= IDENT_CURRENT('Table Name') - 5

答案 5 :(得分:3)

嗯,“最后五行”实际上是最后五行,具体取决于您的聚集索引。根据定义,您的聚簇索引是对行进行排序的方式。所以如果没有一些订单,你真的无法得到“最后五行”。但是,您可以获得与聚簇索引相关的最后五行。

SELECT TOP 5 * FROM MyTable
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC

答案 6 :(得分:3)

select * from table limit 5 offset (select count(*) from table) - 5;

答案 7 :(得分:3)

没有订单,这是不可能的。是什么定义了“底部”?以下将根据它们在数据库中的存储方式选择5行。

SELECT TOP 5 * FROM [TableName]

答案 8 :(得分:2)

如果您没有主键或相同列,请尝试此操作:

select [Stu_Id],[Student_Name] ,[City] ,[Registered], 
       RowNum = row_number() OVER (ORDER BY (SELECT 0))    
from student
ORDER BY RowNum desc 

答案 9 :(得分:2)

在SQL Server 2012中,您可以执行以下操作:

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;

答案 10 :(得分:2)

在mysql中检索最后5行


此查询完美运行

SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC

select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc

答案 11 :(得分:2)

如果您知道总共有多少行,则可以使用ROW_NUMBER()函数。 以下是来自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;

答案 12 :(得分:1)

select * 
from table 
order by empno(primary key) desc 
fetch first 5 rows only

答案 13 :(得分:1)

有一个方便的技巧可以在某些数据库中按数据库顺序排序,

SELECT * FROM TableName ORDER BY true

显然,这可以与此处发布的任何其他建议一起使用,将结果保留为“他们从数据库中排出的顺序”顺序,在某些数据库中,这是他们上次修改的顺序。

答案 14 :(得分:1)

当表格中的行数小于5时,Matt Hamilton和msuvajac的答案不正确。 因为TOP N行数值可能不是负数  可以找到一个很好的例子Here

答案 15 :(得分:1)

我正在使用此代码:

select * from tweets where placeID = '$placeID' and id > (
    (select count(*) from tweets where placeID = '$placeID')-2)

答案 16 :(得分:1)

您可以从记忆中检索它们 首先,您获取DataSet中的行,然后从DataSet中获取最后5个。

答案 17 :(得分:0)

感谢@Apps Tawale,基于his answer,这是另一个(我的)版本,

要选择没有标识列的最后5条记录,

select top 5 *, 
   RowNum = row_number() OVER (ORDER BY (SELECT 0))    
from  [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc

尽管如此,它有一个订单,但在RowNum上:)

注意(1):上述查询将颠倒我们运行主选择查询时获得的顺序。

所以为了维持秩序,我们可以稍微说一下:

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

注意(2):如果没有标识列,查询会在大数据的情况下花费一些时间

答案 18 :(得分:0)

在SQL Server中,如果不在查询中使用排序,这似乎是不可能的。 这就是我用过的。

SELECT *
FROM
(
    SELECT TOP 5 *
    FROM [MyTable]
    ORDER BY Id DESC /*Primary Key*/
) AS T
ORDER BY T.Id ASC; /*Primary Key*/

答案 19 :(得分:0)

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

答案 20 :(得分:-1)

获取该表的计数

select count(*) from TABLE
select top count * from TABLE where 'primary key row' NOT IN (select top (count-5) 'primary key row' from TABLE)