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
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
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
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
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)
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
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
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.
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
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
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.
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
Vous pouvez utiliser select 2 top Id depuis votre table.
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