2010-09-01 10 views
15

Tengo una tabla y necesito recuperar el ID de la segunda fila. ¿Cómo lograr eso?T-SQL ¿Cómo seleccionar solo la segunda fila de una tabla?

Por Top 2 que seleccione las dos primeras filas, pero necesito única la segunda fila

+1

vuelve a formular su pregunta, no tiene sentido. – RPM1984

+1

Necesita aclarar por qué 'top' no funcionará. – annakata

+0

Un blog detallado: http://sforsuresh.in/mysql-query-nth-highest-salary-from-employee-table/ –

Respuesta

20

Suponiendo SQL Server 2005 + un ejemplo de cómo conseguir simplemente la segunda fila (que creo que se le puede pedir? - y es la razón por top no va a funcionar para usted)

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

usando 'TOP 2' en el CTE, como hago en mi respuesta (además del' ROW_NUMBER() '), puede mejorar la eficiencia de la consulta en un factor de aproximadamente 6. Usando' set showplan_all on' my la versión tiene un TotalSubtreeCost de 0.0125678 mientras que esta versión (sin usar un 'TOP 2') tiene un valor de 0.06937763, mientras devuelve el mismo conjunto de resultados. –

+0

@KM - No estoy seguro de si hay un ahorro real allí en lugar de ayudar a que el costo estimado sea más preciso. Cuando uso 'set statistics io on' no parece que haya ninguna diferencia. Soy bastante cauteloso de leer demasiado en las cifras que figuran en el plan de ejecución desde este http://stackoverflow.com/questions/3424650/sql-query-pervious-row-optimisation/3426364#3426364 –

+0

cuando lo ejecuto con 'set statistics io on', su versión se ejecuta con' Table 'spt_values'. Número de escaneo 1, lecturas lógicas 18, lecturas físicas 0, lecturas de lectura anticipada 0, lecturas lógicas de lob 0, lecturas físicas de lob 0, lecturas de lectura de lob 0. 'después de agregar' TOP 2 ', obtengo' Table 'spt_values '. Número de escaneo 1, lecturas lógicas 6, lecturas físicas 0, lecturas de lectura anticipada 0, lecturas lógicas de lob 0, lecturas físicas de lob 0, lecturas de lectura de lob 0. 'Además, el 'set showplan_all on' muestra que los planes de ejecución son diferente. –

0

puede utilizar Select superior 2 Id de yourtable.

0
SELECT TOP 2 [Id] FROM table 
+0

Puede ordenar sus resultados, por lo que top no devolverá los dos primeros, sino si primero y segundo necesita –

+1

debe ordenar los resultados, no tiene garantías de que recibirá los dos primeros sin un pedido de. Nunca use una parte superior sin un pedido y espere obtener los registros más antiguos agregados. – HLGEM

1

Use TOP 2 en SELECCIONAR para obtener el número deseado de filas en la salida. Esto volvería en la secuencia en que se crearon los datos. Si tiene una opción de fecha, puede solicitarla junto con la fecha TOP n.

Para obtener las 2 filas superiores;

SELECT TOP 2 [Id] FROM table 

Para obtener el orden de 2 filas superior por algún campo

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

para obtener sólo segunda fila;

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

Select top 2 [id] from table Order by [id] desc debe darle las últimas dos filas agregadas.

Sin embargo, deberá prestar especial atención a la cláusula order by, ya que eso determinará la primera y la segunda fila devueltas.

Si la consulta iba a cambiar de esta manera:

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

Usted podría conseguir dos filas diferentes. Deberá decidir qué columna usar en su orden por declaración.

1

Ciertamente, TOP navegará si solo quiere los TOP 2, pero si los necesita individualmente para que pueda hacer algo con esos valores, use el ROW_NUMBER que le dará más control sobre las filas que desea seleccionar

ps . Hice esto ya que no estoy seguro si el OP está después de un simple TOP 2 en una selección. (¡Puedo estar equivocado!)

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

Supongo que está utilizando SQL 2005 o posterior. La segunda línea selecciona los 2 filas superiores y usando la 'ORDER BY ROW_COUNT DESC", la segunda fila está dispuesto como primera, entonces se selecciona usando TOP 1

SELECT TOP 1 COLUMN1, COLUMN2 from (
SELECT TOP 2 COLUMN1, COLUMN2 FROM Table) ORDER BY ROW_NUMBER DESC 
+1

Sintaxis incorrecta cerca de la palabra clave 'ORDER'. – Kyberias

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

Uso ROW_NUMBER() numerar las filas , pero use TOP para procesar solo los dos primeros.

probar esto:

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 

SALIDA:

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

(1 row(s) affected) 
0

Esto también es ú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 
6

No hay necesidad de funciones de números de fila si el campo ID es único.

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

Selección Top 1 * FROM (SELECT Top 2 * desde YourTableName) YourTableName ordenado por yourtableColumnName

21

En SQL Server 2012+, puede utilizar 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 
+1

Nunca he visto la funcionalidad OFFSET y FETCH: ¡esto es genial! – tember

0

éste es definitivamente trabajando

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 

// noticias nombre de tabla y newsid nombre de la columna

-1

SELECT * FROM (seleccione ROW_NUMBER() OVER (ORDER BY COLUMN_NAME) como Rowno, * desde Table_Name) Table_Name donde ROWNO = 2

Cuestiones relacionadas