如何在SQL Server 2005中获取(One Before Last)行

wkh*_*sar 1 sql database sql-server sql-server-2005

我有一张桌子(文章),它有10条记录,我想得到最后四条记录(第6,第7,第8,第9)而没有第10条记录.查询也可以用于超过10条记录,以获得最后四行而不是绝对最后一行.提前致谢!

Gor*_*off 6

在SQL中,表本质上是无序的.所以,让我假设您有一个指定排序的列 - 一个id列,一个日期时间或类似的东西.

以下是您想要的:

select top 4 *
from (select top 5 *
      from Article a
      order by id desc
     ) a
order by id asc
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因你没有id,你可以利用以下查询抓住机会:

select a.*
from (select a.*, row_number() over (order by (select NULL)) as seqnum,
             count(*) over () as totcnt
      from Article a
     ) a
where seqnum between totcnt - 5 and totcnt - 1
Run Code Online (Sandbox Code Playgroud)

我想强调,这不能保证有效.根据我的经验,我已经看到seqnum的定义按顺序为行分配顺序号.但是,这不保证工作,并且可能无法在多线程环境中工作.但是,您可能会很幸运(特别是如果您的行适合一个数据页).

顺便说一句,你可以使用相同的想法与真正的列:

select a.*
from (select a.*, row_number() over (order by id) as seqnum,
             count(*) over () as totcnt
      from Article a
     ) a
where seqnum between totcnt - 5 and totcnt - 1
Run Code Online (Sandbox Code Playgroud)