T-SQL如何仅从表中选择第二行?

时间:2010-09-01 10:38:53

标签: sql-server tsql

我有一张桌子,我需要检索第二行的ID。如何实现?

Top 2我选择前两行,但我需要 第二行

18 个答案:

答案 0 :(得分:50)

在SQL Server 2012+中,您可以使用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 :(得分:22)

假设SQL Server 2005+是一个如何获得第二行 的示例(我认为您可能会问 - 并且top不适合您的原因?)

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

答案 2 :(得分:8)

使用ROW_NUMBER()对行进行编号,但使用TOP仅处理前两行。

试试这个:

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

输出:

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

(1 row(s) affected)

答案 3 :(得分:8)

如果字段ID是唯一的,则不需要行号功能。

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

答案 4 :(得分:5)

我猜你正在使用SQL 2005或更高版本。第二行选择前两行并使用'ORDER BY ROW_COUNT DESC',第二行排列为第一行,然后使用TOP 1选择

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

答案 5 :(得分:4)

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

答案 6 :(得分:2)

Select top 2 [id] from table Order by [id] desc应该会让您想要添加最新的两行。

但是,您必须特别注意order by子句,因为这将确定返回的第1行和第2行。

如果要像这样更改查询:

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

你可以得到两个不同的行。您必须通过声明决定在您的订单中使用哪个列。

答案 7 :(得分:1)

在SELECT中使用TOP 2以获得输出中所需的行数。 这将按照创建数据的顺序返回。如果您有日期选项,可以按日期和TOP n条款一起订购。

获得前2行;

SELECT TOP 2 [Id] FROM table 

按某个字段排序前2行

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

仅获得第二排;

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

答案 8 :(得分:1)

如果你只是想要TOP 2,那肯定会上网,但如果你需要它们以便你可以对这些值做些什么,那么使用ROW_NUMBER可以让你更好地控制你想要的行选择

PS。我这样做是因为我不确定OP是否在选择中的简单TOP 2之后。 (我可能错了!)

-- 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

答案 9 :(得分:0)

这也很有用:

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

答案 10 :(得分:0)

根据 SQLDiver 和 Taha Ali 的评论,有一个相对简单的解决方案。

假设有一个字符串包含由函数 ORIGINAL_LOGIN() 检索到的“域\用户名”,而我不需要域组件。

第一种方法

DECLARE @Login NVARCHAR(100)
SELECT @Login = 'domain\username'
-- SELECT @Login = ORIGINAL_LOGIN()

SELECT
    VALUE
FROM
    STRING_SPLIT(@Login, '\')

返回一个有 2 行的表。 第一行包含域,第二行包含请求的用户名。

使用

DECLARE @Login NVARCHAR(100)
SELECT @Login = 'domain\username'
-- SELECT @Login = ORIGINAL_LOGIN()

SELECT
    VALUE
FROM
    STRING_SPLIT(@Login, '\')
ORDER BY
    (SELECT NULL)
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

正好返回临时表中的第二行。

答案 11 :(得分:0)

与上述方法相比,我有一种更简单的方法。

void *

答案 12 :(得分:0)

您可以使用OFFSETFETCH NEXT

SELECT id
FROM tablename
ORDER BY column
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

注意:

  

OFFSET只能与ORDER BY子句一起使用。它不能在其上使用   自己的。

     

偏移值必须大于或等于零。它不可能是   否定,否则返回错误。

     

OFFSET参数用于标识返回的起点   结果集中的行。基本上,它不包括第一组   记录。

     

FETCH参数用于返回一组行数。取   本身不能使用,它与OFFSET结合使用。

答案 13 :(得分:0)

这是非常有效的

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

// 新闻表名和 newsid 列名称

答案 14 :(得分:0)

您可以使用来自yourtable的select top 2 Id。

答案 15 :(得分:-1)

select * from(选择ROW_NUMBER()OVER(ORDER BY Column_Name )为ROWNO,*来自 Table_Name Table_Name 其中ROWNO = 2

答案 16 :(得分:-1)

yourtableColumnName

中选择前1 *(从 YourTableName 中选择前2 *) YourTableName 顺序

答案 17 :(得分:-1)

SELECT TOP 2 [Id] FROM table