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

标签 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
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 - 如何在 SQL Server 2005 中获取 (One Before Last) 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14675304/

相关文章:

sql - 使用 CASE 语句检查表中是否存在列 - SQL Server

mysql - 存储过程返回错误值?

database - 在 VB.Net 数据表中查找特定数量的行/列的平均值并存储到数组

php - HTML PHP 数据库 - 编辑/删除按钮 - 传递值

SQL Server - 有条件地连接到任何不为空的表

sql - 在 SQLite FTS3 搜索中包含部分匹配项

php - 使用 WHERE 分隔符选择多个列时 MySQL 语法错误?

sql-server - 如何针对 RDS SQL Server 实例执行 SQL 查询

mysql - SQL Max函数检索一条记录与其他表中的相关字段

database - 在 PostgreSQL 中难以将 CTE 与窗口 PARTITION BY 和字符串模式匹配结合使用