2017-10-05 387 views
0
select top 20 * 
from dbo.DUTs D 
inner join dbo.Statuses S on d.StatusID = s.StatusID 
where s.Description = 'Active' 

上面的SQL查询返回前20行,如何从上述查询的结果中获得第n行?我查看以前的帖子,发现第n行,并不清楚用于我的目的。使用sql查找第n行

谢谢。

+1

时退房SQL中的OFFSET关键字。它用于分页记录,但可能对您有用。 – xDJR1875

+1

[我如何获得SQL Server表中的第n行?](https://stackoverflow.com/questions/2273558/how-do-i-get-the-nth-row-in-a- sql-server-table) – Valli

回答

1

行顺序是任意的,所以我会添加一个ORDER BY表达式。然后,你可以这样做:

SELECT TOP 1 * FROM (SELECT TOP 20 * FROM ... ORDER BY d.StatusID) AS d ORDER BY d.StatusID DESC 

得到第20行。

您还可以使用OFFSET像:

SELECT * FROM ... ORDER BY d.StatusID OFFSET 19 ROWS FETCH NEXT 1 ROWS ONLY 

还有第三个选项:

SELECT * FROM (SELECT *, rownum = ROW_NUMBER() OVER (ORDER BY d.StatusID) FROM ...) AS a WHERE rownum = 20 
0

我倾向于使用热膨胀系数与ROW_NUMBER()函数来得到我列出顺序编号。正如@zambonee所说的,无论哪种方式,您都需要一个ORDER BY子句,或者SQL可以每次都以不同的顺序放置它们。它通常不会,但是没有自己订购,你不能保证两次获得同样的东西。在这里,我假设有一个[DateCreated]字段(DATETIME NOT NULL DEFAULT GETDATE()),这通常是一个好主意,所以您知道该记录何时输入。这是说“给我的那张桌子的一切,并添加行号与最近的战绩为#1”:

; WITH AllDUTs 
AS (
    SELECT * 
      , DateCreatedRank = ROW_NUMBER() OVER(ORDER BY [DateCreated] DESC) 
    FROM dbo.DUTs D 
      INNER JOIN dbo.Statuses S ON D.StatusID = S.StatusID 
    WHERE S.Description = 'Active' 
    ) 
SELECT * 
FROM AllDUTs 
WHERE AllDUTs.DateCreatedRank = 20; 
+0

谢谢大家,及时回复。我得到了它的工作。再次感谢。 – user2329418

0
SELECT * FROM (SELECT * FROM EMP ORDER BY ROWID DESC) WHERE ROWNUM<11 
0

它的另一个示例:

SELECT * ,CASE WHEN COUNT(0)OVER() =ROW_NUMBER()OVER(ORDER BY number) THEN 1 ELSE 0 END IsNth 
FROM ( 
    select top 10 * 
    from master.dbo.spt_values AS d 
    where d.type='P' 
) AS t 
 
+------+--------+------+-----+------+--------+-------+ 
| name | number | type | low | high | status | IsNth | 
+------+--------+------+-----+------+--------+-------+ 
| NULL | 0  | P | 1 | 1 | 0  | 0  | 
| NULL | 1  | P | 1 | 2 | 0  | 0  | 
| NULL | 2  | P | 1 | 4 | 0  | 0  | 
| NULL | 3  | P | 1 | 8 | 0  | 0  | 
| NULL | 4  | P | 1 | 16 | 0  | 0  | 
| NULL | 5  | P | 1 | 32 | 0  | 0  | 
| NULL | 6  | P | 1 | 64 | 0  | 0  | 
| NULL | 7  | P | 1 | 128 | 0  | 0  | 
| NULL | 8  | P | 2 | 1 | 0  | 0  | 
| NULL | 9  | P | 2 | 2 | 0  | 1  | 
+------+--------+------+-----+------+--------+-------+