У меня есть таблица, и мне нужно получить идентификатор второй строки. Как достичь этого?
В Top 2
я выбираю две первые строки, но мне нужна только вторая строка
У меня есть таблица, и мне нужно получить идентификатор второй строки. Как достичь этого?
В Top 2
я выбираю две первые строки, но мне нужна только вторая строка
Предположим, что 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
В 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
Используйте 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)
Нет необходимости в функциях нумерации строк, если идентификатор поля уникален.
SELECT TOP 1 *
FROM (
SELECT TOP 2 *
FROM yourTable
ORDER BY ID
) z
ORDER BY ID DESC
Я предполагаю, что вы используете SQL 2005 или выше. 2-я строка выбирает верхние 2 строки и, используя ORDER BY ROW_COUNT DESC
, 2-я строка располагается первой, затем она выбирается с помощью TOP 1.
SELECT TOP 1 COLUMN1, COLUMN2
from (
SELECT TOP 2 COLUMN1, COLUMN2
FROM Table
) ORDER BY ROW_NUMBER DESC
with T1 as
(
select row_number() over(order by ID) rownum, T2.ID
from Table2 T2
)
select ID
from T1
where rownum=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
Вы можете получить две разные строки. Вам нужно будет решить, какой столбец использовать в вашем заказе по инструкции.
Используйте TOP 2
в SELECT, чтобы получить желаемое количество строк в выводе. Это вернуло бы последовательность, в которой были созданы данные. Если у вас есть вариант даты, вы можете заказать по дате вместе с TOP n
Clause.
Чтобы получить 2 верхних ряда;
SELECT TOP 2 [Id] FROM table
Чтобы получить порядок 2 верхних строк по некоторому полю
SELECT TOP 2 [ID] FROM table ORDER BY <YourColumn> ASC/DESC
Получить только 2-й ряд;
WITH Resulttable AS
(
SELECT TOP 2
*, ROW_NUMBER() OVER(ORDER BY YourColumn) AS RowNumber
FROM @Table
)
SELECT *
FROM Resultstable
WHERE RowNumber = 2
Конечно, TOP будет всплывать, если вы просто хотите TOP 2, но если вам нужно их индивидуально, чтобы вы могли что-то сделать с этими значениями, используйте ROW_NUMBER, который даст вам больше контроля над строками, которые вы хотите выбрать
пс. Я сделал это, так как не уверен, что OP после простого TOP 2 в select. (Возможно, я ошибаюсь!)
-- 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
Это также полезно:
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
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
//имя таблицы новостей и название столбца новостей
Вы можете использовать OFFSET
и FETCH NEXT
SELECT id
FROM tablename
ORDER BY column
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
НОТА:
OFFSET можно использовать только с предложением ORDER BY. Он не может быть использован сам по себе.
Значение OFFSET должно быть больше или равно нулю. Он не может быть отрицательным, иначе вернет ошибку.
Аргумент OFFSET используется для определения начальной точки для возврата строк из набора результатов. По сути, это исключает первый набор записей.
Аргумент FETCH используется для возврата набора количества строк. FETCH не может использоваться сам по себе, он используется в сочетании с OFFSET.
У меня есть намного более простой способ, чем описанные выше.
DECLARE @FirstId int, @SecondId int
SELECT TOP 1 @FirstId = TableId from MyDataTable ORDER BY TableId
SELECT TOP 1 @SecondId = TableId from MyDataTable WHERE TableId <> @FirstId ORDER BY TableId
SELECT @SecondId
Вы можете использовать select top 2 Id from yourtable
.
select *
from (
select ROW_NUMBER() OVER (ORDER BY Column_Name) as ROWNO, *
from Table_Name
) Table_Name
where ROWNO = 2
SELECT TOP 2 [Id] FROM table
select Top 1 *
from (
select Top 2 *
from YourTableName
) YourTableName
order by yourtableColumnName