ti-enxame.com

T-SQL Como selecionar apenas a segunda linha de uma tabela?

Eu tenho uma tabela e preciso recuperar o ID da segunda linha. Como conseguir isso?

Por Top 2 eu seleciono as duas primeiras linhas, mas preciso de somente a segunda linha

23
Tony

Assumindo o SQL Server 2005+ um exemplo de como obter apenas a segunda linha (que eu acho que você pode estar perguntando - e é a razão pela qual top não funcionará para você?)

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
22
Martin Smith

No SQL Server 2012+, você pode usar 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
44
SQLDiver

Não há necessidade de funções de número de linha se o ID do campo for exclusivo.

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

Use ROW_NUMBER() para numerar as linhas, mas use TOP para processar apenas as duas primeiras.

tente isso:

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

SAÍDA:

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

(1 row(s) affected)
8
KM.

Eu estou supondo que você está usando o SQL 2005 ou superior. A segunda linha seleciona as duas primeiras linhas e usando 'ORDER BY ROW_COUNT DESC', a segunda linha é organizada como sendo a primeira, depois é selecionada usando TOP 1

SELECT TOP 1 COLUMN1, COLUMN2 from (
SELECT TOP 2 COLUMN1, COLUMN2 FROM Table) ORDER BY ROW_NUMBER DESC 
5
Patriotec
with T1 as
(
select row_number() over(order by ID) rownum, T2.ID
from Table2 T2
)
select ID from T1 where rownum=2
4
Anil Soman

Select top 2 [id] from table Order by [id] desc deve dar-lhe as últimas duas linhas adicionadas.

No entanto, você terá que prestar atenção especial à cláusula order by, pois isso determinará a primeira e a segunda linha retornadas.

Se a consulta fosse alterada assim:

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

Você pode obter duas linhas diferentes. Você terá que decidir qual coluna usar no seu pedido por declaração.

2
codingbadger

Use TOP 2 no SELECT para obter o número desejado de linhas na saída. Isso retornaria na seqüência em que os dados foram criados. Se você tiver uma opção de data, poderá fazer o pedido até a data juntamente com a cláusula TOP n.

Para obter as 2 primeiras linhas;

SELECT TOP 2 [Id] FROM table 

Para obter as 2 primeiras linhas, ordenar por algum campo

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

Para obter apenas 2ª linha;

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

Certamente TOP surfice se você simplesmente quer o TOP 2, mas se você precisar deles individualmente para que você possa fazer algo com esses valores então use o ROW_NUMBER o qual lhe dará mais controle sobre as linhas que você quer selecionar

ps. Eu fiz isso porque não tenho certeza se o OP está após um simples TOP 2 em um select. (Eu posso estar errado!)

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

você pode usar OFFSET e FETCH NEXT

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

NOTA:

OFFSET só pode ser usado com a cláusula ORDER BY. Não pode ser usado no próprio .

O valor OFFSET deve ser maior ou igual a zero. Não pode ser Negativo, senão retornar erro.

O argumento OFFSET é usado para identificar o ponto de partida para retornar Linhas de um conjunto de resultados. Basicamente, exclui o primeiro conjunto de registros .

O argumento FETCH é usado para retornar um conjunto de números de linhas. FETCH Não pode ser usado em si, é usado em conjunto com OFFSET.

0
Vivekanand Panda

Isso também é útil:

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

Você pode usar select top 2 Id da sua mesa.

0
swapneel

Isso está desafiadoramente funcionando

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

// news table name e newsid nome da coluna

0
Kanhaiya lal Rajora