我有一张桌子,我需要检索第二行的ID。如何实现?
按Top 2
我选择前两行,但我需要 第二行
答案 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)
您可以使用OFFSET
和FETCH 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