web-dev-qa-db-fra.com

T-SQL Comment sélectionner uniquement la deuxième ligne d'une table?

J'ai une table et j'ai besoin de récupérer l'ID de la deuxième ligne. Comment y parvenir?

Par Top 2 je sélectionne les deux premières lignes, mais il me faut seulement la deuxième

23
Tony

En supposant que SQL Server 2005+ soit un exemple de la façon d’obtenir seulement la deuxième ligne (que vous demandez peut-être - et c’est la raison pour laquelle top ne fonctionnera pas pour vous?)

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

Dans SQL Server 2012+, vous pouvez utiliser 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

Pas besoin de fonctions de numéro de ligne si le champ ID est unique.

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

Utilisez ROW_NUMBER() pour numéroter les lignes, mais TOP pour ne traiter que les deux premières.

essaye ça:

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

SORTIE:

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

(1 row(s) affected)
8
KM.

Je suppose que vous utilisez SQL 2005 ou supérieur. La 2ème ligne sélectionne les 2 premières lignes et en utilisant 'ORDER BY ROW_COUNT DESC ", la 2ème ligne est agencée en premier, puis elle est sélectionnée en utilisant 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 devrait vous donner les deux dernières lignes ajoutées.

Cependant, vous devrez porter une attention particulière à la clause order by qui déterminera les 1ère et 2ème lignes renvoyées.

Si la requête devait être modifiée comme ceci:

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

Vous pouvez obtenir deux lignes différentes. Vous devrez décider quelle colonne utiliser dans votre ordre par instruction.

2
codingbadger

Utilisez TOP 2 dans SELECT pour obtenir le nombre souhaité de lignes dans la sortie ..__ Cela retournera dans l'ordre les données créées. Si vous avez une option de date, vous pouvez commander par date avec la clause TOP n.

Pour obtenir les 2 premières lignes;

SELECT TOP 2 [Id] FROM table 

Pour obtenir les 2 premières lignes en ordre par champ

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

Pour obtenir seulement la 2e rangée;

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

TOP fera certainement un surfice si vous voulez simplement le TOP 2, mais si vous en avez besoin individuellement pour pouvoir utiliser quelque chose avec ces valeurs, utilisez ROW_NUMBER , ce qui vous donnera plus de contrôle sur les lignes que vous souhaitez sélectionner.

ps. J'ai fait ceci car je ne suis pas sûr que l'OP soit après un simple TOP 2 dans une sélection. (J'ai peut-être tort!)

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

vous pouvez utiliser OFFSET et FETCH NEXT

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

REMARQUE:

OFFSET ne peut être utilisé qu'avec la clause ORDER BY. Il ne peut pas être utilisé sur son posséder.

La valeur OFFSET doit être supérieure ou égale à zéro. Ça ne peut pas être négatif, sinon erreur de retour.

L'argument OFFSET est utilisé pour identifier le point de départ à renvoyer lignes d'un jeu de résultats. Fondamentalement, il exclut le premier ensemble de enregistrements.

L'argument FETCH est utilisé pour renvoyer un ensemble de nombre de lignes. FETCH ne peut pas être utilisé tout seul, il est utilisé en conjonction avec OFFSET.

0
Vivekanand Panda

Ceci est également utile:

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

Vous pouvez utiliser select 2 top Id depuis votre table.

0
swapneel

Cela fonctionne avec défi

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 nom de la table et newsid nom de la colonne

0