2011-08-21 48 views
7

Chúng tôi có thể chọn Top 10 hoặc Select Top 'N' hàng từ SQL Server.Bỏ qua hàng đầu tiên trong SQL Server 2005?

Nhưng có cách nào để bỏ qua hàng đầu tiên từ kết quả của hàng đầu không ??

Tôi có nghĩa là tôi nhận được kết quả từ select top 5, sau đó tôi bỏ qua hàng đầu tiên và chỉ nhận được 4 hàng tiếp theo?

Trả lời

10

Bạn có thể sử dụng OVER khoản và chức năng xếp hạng. Bạn không thể lọc trực tiếp điều này vì vậy bạn cần cho chúng tôi truy vấn phụ hoặc biểu thức bảng chung, ví dụ bên dưới sử dụng sau.

DECLARE @MyTable TABLE 
(
    ID INT, 
    Name VARCHAR(15) 
) 
INSERT INTO @MyTable VALUES (1, 'Alice') 
INSERT INTO @MyTable VALUES (2, 'Bob') 
INSERT INTO @MyTable VALUES (3, 'Chris') 
INSERT INTO @MyTable VALUES (4, 'David') 
INSERT INTO @MyTable VALUES (5, 'Edgar') 

;WITH people AS 
(
    SELECT ID, Name, ROW_NUMBER() OVER (ORDER BY ID) RN 
    FROM @MyTable 
) 
SELECT ID, Name 
FROM people 
WHERE RN > 1 

Sẽ có hỗ trợ tốt hơn cho pagination trong phiên bản tiếp theo của SQL Server (tên mã Denali) với các từ khóa OFFSETFETCH.

+0

Tuyệt vời ... tôi không nghĩ theo hướng này. tôi đã cố gắng để chọn với top 5 sau đó từ đó tôi đã cố gắng để bỏ qua đầu tiên với 'bỏ qua' từ ... Cảm ơn rất nhiều ... :-) –

+1

1 cho đề cập đến nó là một chức năng xếp hạng - mà làm cho điều này một thậm chí câu trả lời hữu ích hơn – Sascha

+0

+1 cho thông tin 'OFFSET' và' FETCH' .. – dotNETbeginner

5

Bạn có thể làm một cái gì đó như thế này:

SELECT 
    * 
FROM (
     SELECT  
      row_number() OVER (ORDER BY ID DESC) AS [rownum], 
      * 
     FROM 
      tbl 
) T 
WHERE 
    rownum BETWEEN (2) AND (5) 

Cập nhật:

cập nhật để có giá trị của bạn.

Cập nhật 2:

Sửa lỗi với truy vấn phụ mất tích. Cảm ơn Chris Diver đã chỉ ra điều này.

+0

Cảm ơn .. giải pháp của bạn cũng hoạt động .. :-) –

+3

Bạn không thể lọc mà không có truy vấn phụ, điều này sẽ không hoạt động. –

+0

Cảm ơn bạn đã chỉ ra lỗi của tôi – Sascha

2

Something như thế này:

-- Test table 
declare @T table(ID int) 

-- Add test data 
insert into @T 
select 1 union all 
select 2 union all 
select 3 union all 
select 4 union all 
select 5 union all 
select 6 

-- Query using row_number() over(...) 
-- to get rows 2 - 5 
select T.ID 
from (
     select *, 
       row_number() over(order by ID) as rn 
     from @T  
    ) as T 
where T.rn between 2 and 5 
Các vấn đề liên quan