如果我正在查询数据库,如何从给定行返回第5行?

时间:2009-05-23 20:30:18

标签: sql sql-server select

如果我有一个行ID,并且我希望从该行返回第5行,我该怎么做?

通常我可以去

rowId - 5

这将是第5行的ID ...

但是,我需要考虑是否删除了一行,这意味着,例如

39,40,41,42,43,44,45

如果rowId为45,那么我的第5行将获得40的rowId,但是如果第42行被删除,那么我们就会...

39,40,41,43,44,45

并且rowId为45会再给我一个40的rowId,它应该给我39(因为它是第5行)。

我想不出任何方法来解决这个问题,我不能在删除后对id进行重新编号,因为该表可能会增长到一百万行。有人有什么想法吗?

谢谢, 马特

6 个答案:

答案 0 :(得分:3)

您可以使用T-SQL的ROW_NUMBER排名功能......

这是一些伪SQL代码:

SELECT id, value,
   ROW_NUMBER() OVER ( ORDER BY id) AS RowNo
FROM ranking AS r1
WHERE RowNo = selectedRowNo - 5

答案 1 :(得分:2)

如果您使用的是Sql Server 2005或更高版本,则可以使用ROW_NUMBER:

SELECT *
FROM (
    SELECT TOP 5
         ROW_NUMBER() OVER (ORDER BY YourId DESC) AS RowNr,
         *
    FROM YourTable
    WHERE YourId < CurrentId
    ORDER BY YourId DESC
) vw
WHERE RowNr = 5

“ORDER BY ID ASC”指定您希望如何编号的行;您可以将其更改为几乎任何排序顺序,例如:

ROW_NUMBER() OVER (ORDER BY YourTimestamp DESC) AS RowNr,

在根据年龄查找前一行的查询中会有所帮助。

答案 2 :(得分:2)

以自动答案为基础

select top 1 * from (
     select top 5 * from table where Id < 45 order by id desc
) as fiverows order by id asc

这将返回第5行,仅返回第5行。

注意:选择*是baaaaaad,mkay? : - )

答案 3 :(得分:1)

在我看来,你希望基于顺序ID返回第5行(这与数据库中的物理顺序无关)?

如果这是您想要的,并且您知道要开始的ID,例如45,那么

从表中选择前5 *,其中Id&lt; 45由id desc命令

答案 4 :(得分:1)

我意识到这是双嵌套的,但如果你不经常这样做,和/或RowNum列被索引,那不应该造成太多麻烦:

SELECT *
  FROM YourTable
 WHERE RowNum = (SELECT MIN(RowNum)
                   FROM (SELECT TOP 5 RowNum
                           FROM YourTable
                       ORDER BY RowNum DESC) t)

此外,此解决方案也适用于旧版本的SQL,而“over”子句仅适用于2005+。

答案 5 :(得分:1)

我通常使用CTE进行编号。这样的事情可以做到:

;WITH NumberedRows
AS
(SELECT   ID, ROW_NUMBER() OVER(ORDER BY ID ASC) AS RowNumber
FROM      MyTable)
SELECT    ID
FROM      NumberedRows
WHERE     RowNumber = (SELECT RowNumber FROM NumberedRows WHERE ID = @MyID) - 5

它与已经提供的任何解决方案没有太大的不同,但我发现CTE的抽象使得代码的意图更加清晰。