2013-02-03 96 views
1

我有一張表(條),它有10條記錄,我想得到最後四條記錄(第6,7,8,9號)沒有第10條。查詢也可以用於超過10條記錄,以獲得最後四行,而不是絕對最後一行。 在此先感謝!如何在SQL Server 2005中獲得(One Before Last)行

+2

請出示你的表格佈局中,列名和類型。 –

+2

有可能你陷入了[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。提供更多關於你想要實現的細節,可能有更好的解決方案。 –

+0

...比直接根據您的要求。 –

回答

6

在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