如果我有一个行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进行重新编号,因为该表可能会增长到一百万行。有人有什么想法吗?
谢谢, 马特
答案 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的抽象使得代码的意图更加清晰。