T-SQL Как выбрать только вторую строку из таблицы?

У меня есть таблица, и мне нужно получить идентификатор второй строки. Как достичь этого?

В Top 2 я выбираю две первые строки, но мне нужна только вторая строка

Ответ 1

Предположим, что 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

В 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

Ответ 3

Используйте 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)

Ответ 4

Нет необходимости в функциях нумерации строк, если идентификатор поля уникален.

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

Ответ 5

Я предполагаю, что вы используете 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 

Ответ 6

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

Ответ 7

Select top 2 [id] from table Order by [id] desc должен дать вам пожелать, чтобы вы добавили последние две строки.

Однако вам нужно будет обратить особое внимание на предложение order by, так как это определит возвращаемые 1-й и 2-й строки.

Если запрос должен быть изменен следующим образом:

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

Вы можете получить две разные строки. Вам нужно будет решить, какой столбец использовать в вашем заказе по инструкции.

Ответ 8

Используйте 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

Ответ 9

Конечно, 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

Ответ 10

Это также полезно:

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

Ответ 11

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

//имя таблицы новостей и название столбца новостей

Ответ 12

Вы можете использовать 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.

Ответ 13

У меня есть намного более простой способ, чем описанные выше.

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 

Ответ 14

Вы можете использовать select top 2 Id from yourtable.

Ответ 15

select *
from (
  select ROW_NUMBER() OVER (ORDER BY Column_Name) as ROWNO, *
  from Table_Name
) Table_Name
where ROWNO = 2

Ответ 16

SELECT TOP 2 [Id] FROM table

Ответ 17

select Top 1 *
from (
  select Top 2 *
  from YourTableName
) YourTableName
order by yourtableColumnName