【问题标题】:How to get (One Before Last) row in SQL Server 2005如何在 SQL Server 2005 中获取(前一个)行
【发布时间】:2013-02-03 17:44:35
【问题描述】:

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

【问题讨论】:

  • 请显示您的表格布局、列名和类型。
  • 你可能掉进了XY problem。提供有关您要实现的目标的更多详细信息,并且可能有更好的解决方案。
  • ...而不是直接按照您的要求。

标签: sql sql-server database sql-server-2005


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    相关资源
    最近更新 更多