如何在SQLServer2005中获取(前一行)行

如何在SQLServer2005中获取(前一行)行,sql,sql-server,database,sql-server-2005,Sql,Sql Server,Database,Sql Server 2005,我有一个表(文章),它有10条记录,我想得到最后四条记录(第6条、第7条、第8条、第9条),没有第10条。查询还可以处理10条以上的记录,以获取最后四行,而不获取最后一行的绝对值。 提前谢谢 在SQL中,表本身就是无序的。所以,让我假设您有一个列来指定顺序——一个id列、一个日期时间或类似的内容 以下内容符合您的要求: select top 4 * from (select top 5 * from Article a order by id desc ) a

我有一个表(文章),它有10条记录,我想得到最后四条记录(第6条、第7条、第8条、第9条),没有第10条。查询还可以处理10条以上的记录,以获取最后四行,而不获取最后一行的绝对值。
提前谢谢

在SQL中,表本身就是无序的。所以,让我假设您有一个列来指定顺序——一个id列、一个日期时间或类似的内容

以下内容符合您的要求:

select top 4 *
from (select top 5 *
      from Article a
      order by id desc
     ) a
order by id asc
如果出于某种原因,您没有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
我想强调的是,这并不能保证有效。根据我的经验,我已经看到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

在SQL中,表本质上是无序的。所以,让我假设您有一个列来指定顺序——一个id列、一个日期时间或类似的内容

以下内容符合您的要求:

select top 4 *
from (select top 5 *
      from Article a
      order by id desc
     ) a
order by id asc
如果出于某种原因,您没有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
我想强调的是,这并不能保证有效。根据我的经验,我已经看到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

请显示您的表格布局、列名和类型。您可能已陷入错误。请提供更多关于您试图实现的目标的详细信息,可能有更好的解决方案……而不仅仅是直接遵循您的要求。请显示您的表布局、列名和类型。您可能已经陷入了困境。给出你想要实现的目标的更多细节,可能会有更好的解决方案……而不仅仅是直接遵循你的要求。