2010-09-01 30 views
15

Tôi có một bảng và tôi cần truy xuất ID của hàng thứ hai. Làm thế nào để đạt được điều đó?T-SQL Làm cách nào để chỉ chọn hàng Thứ hai từ một bảng?

By Top 2 tôi chọn hai hàng đầu tiên, nhưng tôi cần chỉ hàng thứ hai

+1

từ lại câu hỏi của bạn, điều đó không có ý nghĩa gì cả. – RPM1984

+1

Bạn cần phải làm rõ lý do tại sao 'top' sẽ không hoạt động. – annakata

+0

Một blog chi tiết: http://sforsuresh.in/mysql-query-nth-highest-salary-from-employee-table/ –

Trả lời

20

Giả SQL Server 2005 + một ví dụ về làm thế nào để có được chỉ hàng thứ hai (mà tôi nghĩ bạn có thể được yêu cầu - và là lý do tại sao top sẽ không làm việc cho bạn)

set statistics io on 

;with cte as 
(
select * , 
ROW_NUMBER() over (order by number) as rn 
from master.dbo.spt_values 
) 
select * from cte where rn=2 

/*Just to add in what I was running RE: Comments*/ 
;with cte as 
(
select top 2 * , 
ROW_NUMBER() over (order by number) as rn 
from master.dbo.spt_values 
) 
select * from cte where rn=2 
+0

bằng cách sử dụng 'TOP 2' trong CTE, giống như tôi làm trong câu trả lời của tôi (thêm vào' ROW_NUMBER() '), bạn có thể cải thiện hiệu quả của truy vấn theo hệ số khoảng 6. Sử dụng' set showplan_all on' my phiên bản có TotalSubtreeCost là 0.0125678 trong khi phiên bản này (không sử dụng 'TOP 2') có giá trị là 0,06937763, trong khi trả về cùng một tập kết quả. –

+0

@KM - Tôi không chắc liệu có tiết kiệm thực sự ở đó như trái ngược với việc giúp làm cho chi phí ước tính chính xác hơn hay không. Khi tôi sử dụng 'tập hợp số liệu thống kê io on' nó không giống như nó làm cho bất kỳ sự khác biệt. Tôi khá thận trọng khi đọc quá nhiều vào các số liệu được đưa ra trong kế hoạch thực hiện kể từ http://stackoverflow.com/questions/3424650/sql-query-pervious-row-optimisation/3426364#3426364 –

+0

khi tôi chạy nó với 'set statistics io on', phiên bản của bạn chạy với' Table 'spt_values'. Quét số 1, hợp lý đọc 18, đọc vật lý 0, đọc trước đọc 0, lob logic đọc 0, lob đọc vật lý 0, lob đọc-trước đọc 0.' sau khi thêm 'TOP 2', tôi nhận được' Bảng 'spt_values '. Quét số 1, lôgic đọc 6, đọc vật lý 0, đọc trước đọc 0, lob logic đọc 0, lob đọc vật lý 0, lob đọc trước đọc 0.' Ngoài ra, 'set showplan_all on' cho thấy rằng các kế hoạch thực hiện là khác nhau. –

0

Bạn có thể sử dụng chọn Id 2 đầu từ yourtable.

0
SELECT TOP 2 [Id] FROM table 
+0

Bạn có thể đặt hàng kết quả của mình, vì vậy, đầu sẽ không trả lại hai kết quả đầu tiên mà cho dù bạn đầu tiên và thứ hai cần –

+1

YOu phải đặt hàng các kết quả, bạn không đảm bảo rằng bạn sẽ nhận được hai kết quả đầu tiên mà không cần đơn hàng. Không bao giờ sử dụng hàng đầu mà không có đơn đặt hàng và mong muốn nhận được các bản ghi sớm nhất được thêm vào. – HLGEM

1

Sử dụng TOP 2 trong SELECT để nhận số hàng mong muốn trong đầu ra. Điều này sẽ trở lại theo trình tự dữ liệu được tạo. Nếu bạn có tùy chọn ngày, bạn có thể đặt hàng theo ngày cùng với điều khoản TOP n.

Để nhận được 2 hàng trên cùng;

SELECT TOP 2 [Id] FROM table 

Để có được 2 hàng trên cùng trật tự của một số lĩnh vực

SELECT TOP 2[ID] FROM table ORDER BY <YourColumn> ASC/DESC 

Để Nhận Row chỉ 2;

WITH Resulttable AS 
( 
SELECT TOP 2 
    *, ROW_NUMBER() OVER(ORDER BY YourColumn) AS RowNumber 
    FROM @Table 
) 
SELECT * FROM Resultstable WHERE RowNumber=2 
2

Select top 2 [id] from table Order by [id] desc sẽ cung cấp cho bạn muốn thêm hai hàng mới nhất.

Tuy nhiên, bạn sẽ phải đặc biệt chú ý đến mệnh đề order by vì điều đó sẽ xác định hàng thứ nhất và hàng thứ 2 được trả lại.

Nếu truy vấn đã được thay đổi như thế này:

Select top 2 [id] from table Order by ModifiedDate desc

Bạn có thể nhận được hai hàng khác nhau. Bạn sẽ phải quyết định cột nào sẽ được sử dụng trong đơn đặt hàng của bạn bằng bảng sao kê.

1

Chắc chắn TOP sẽ lướt nếu bạn chỉ muốn TOP 2, nhưng nếu bạn cần chúng một cách riêng lẻ để bạn có thể làm điều gì đó với những giá trị đó thì hãy sử dụng ROW_NUMBER sẽ cung cấp cho bạn nhiều quyền kiểm soát hơn đối với các hàng bạn muốn chọn

ps . Tôi đã làm điều này như tôi không chắc chắn nếu OP là sau một TOP 2 đơn giản trong một lựa chọn. (Tôi có thể sai!)

-- Get first row, same as TOP 1 
SELECT [Id] FROM 
(
    SELECT [Id], ROW_NUMBER() OVER (ORDER BY [Id]) AS Rownumber 
    FROM table 
) results 
WHERE results.Rownumber = 1 

-- Get second row only 
SELECT [Id] FROM 
(
    SELECT [Id], ROW_NUMBER() OVER (ORDER BY [Id]) AS Rownumber 
    FROM table 
) results 
WHERE results.Rownumber = 2 
6

Tôi đoán bạn đang sử dụng SQL 2005 trở lên. Dòng 2 chọn 2 hàng trên cùng và bằng cách sử dụng 'ORDER BY ROW_COUNT DESC", hàng thứ 2 được bố trí như là đầu tiên, sau đó nó được chọn sử dụng TOP 1

SELECT TOP 1 COLUMN1, COLUMN2 from (
SELECT TOP 2 COLUMN1, COLUMN2 FROM Table) ORDER BY ROW_NUMBER DESC 
+1

sai gần từ khóa' ORDER '. – Kyberias

4
with T1 as 
(
select row_number() over(order by ID) rownum, T2.ID 
from Table2 T2 
) 
select ID from T1 where rownum=2 
7

Sử dụng ROW_NUMBER() lên vị trí số các hàng , nhưng sử dụng TOP để chỉ xử lý hai đầu tiên.

thử điều này:

DECLARE @YourTable table (YourColumn int) 
INSERT @YourTable VALUES (5) 
INSERT @YourTable VALUES (7) 
INSERT @YourTable VALUES (9) 
INSERT @YourTable VALUES (17) 
INSERT @YourTable VALUES (25) 

;WITH YourCTE AS 
(
SELECT TOP 2 
    *, ROW_NUMBER() OVER(ORDER BY YourColumn) AS RowNumber 
    FROM @YourTable 
) 
SELECT * FROM YourCTE WHERE RowNumber=2 

OUTPUT:

YourColumn RowNumber 
----------- -------------------- 
7   2 

(1 row(s) affected) 
0

này cũng rất hữu ích:

SELECT 
t.* 
FROM 
(
SELECT 
e1.*, 
row_number() OVER (
ORDER BY e1.Rate DESC) AS _Rank 
FROM 
HumanResources.EmployeePayHistory AS e1 
) AS t 
WHERE 
t._Rank = 2 
6

Không cần các chức năng số hàng nếu trường ID là duy nhất.

SELECT TOP 1 * FROM 
        (SELECT TOP 2 * 
        FROM yourTable 
        ORDER BY ID 
        ) z 
ORDER BY ID DESC 
0

Chọn Top 1 * từ (chọn Top 2 * từ YourTableName) YourTableName trật tự bởi yourtableColumnName

21

Trong SQL Server 2012+, bạn có thể sử dụng OFFSET ... FETCH:

SELECT 
    <column(s)> 
FROM 
    <table(s)> 
ORDER BY 
    <sort column(s)> 
OFFSET 1 ROWS -- Skip this number of rows 
FETCH NEXT 1 ROW ONLY; -- Return this number of rows 
+1

Tôi chưa bao giờ thấy chức năng OFFSET và FETCH - điều này thật tuyệt! – tember

0

Điều này đang thách thức làm việc

SELECT * FROM 
(
SELECT top 3 *, ROW_NUMBER() OVER (ORDER BY [newsid] desc) AS Rownumber 
FROM news where (news_type in(2,12)) 
) results 
WHERE results.Rownumber = 1 

// tin tức tên bảng và tên NewSID cột

-1

select * from (chọn ROW_NUMBER() OVER (ORDER BY column_name) như ROWNO, * từ Table_Name) Table_Name trong đó ROWNO = 2

Các vấn đề liên quan