2010-02-16 29 views
12

¿Cómo obtendría la enésima fila (es decir, la 5ª fila) del resultado de una consulta en SQL Server?¿Cómo obtengo la enésima fila en una tabla de SQL Server?

+0

¿Quieres una consulta SQL que devuelve los valores en la columna definida como la quinta columna en esa tabla? De modo que si uno fuera a insertar otra columna como segunda columna, presione las columnas subsiguientes hacia abajo, entonces esta consulta que estamos discutiendo luego devolvería lo que anteriormente había sido la cuarta columna. –

+1

Por favor, aclare su pregunta. ¿Estás buscando la quinta fila o la quinta columna? –

+0

Como el título de la pregunta es "¿Cómo obtengo la enésima fila en una tabla de SQL Server?", Creo que está bastante claro que quiere la quinta fila, no la quinta. – mwigdahl

Respuesta

8

Tiene muchas opciones, basadas en this link. Todas estas técnicas se aplican a SQL 2000. La que he usado anteriormente es la opción n. ° 1, donde toma un subconjunto de 5 elementos ordenado de una manera y luego selecciona la fila "SUPERIOR" del subconjunto ordenado de otra manera. ¡Funciona genial!

SELECT TOP 1 FName 
FROM 
( 
    SELECT TOP 5 FName 
    FROM Names 
    ORDER BY FName 
) sub 
ORDER BY FName DESC 

En SQL 2005 y hasta es más fácil - que tienen funciones de ordenación de filas como ROW_NUMBER() que hacer lo que necesita directamente.

+4

ROW_NUMBER() está presente en SQL Server 2005 ... – AdaTheDev

+0

Modificado, gracias! – mwigdahl

+0

Tenga en cuenta que cuando utiliza este método y hay n <5 filas, obtendrá la enésima fila y no nada. Por ejemplo, si hay 4 filas en Names, esto devolverá la 4ª fila. Esto puede ser bueno o malo dependiendo de lo que esperas. –

17

SQL Server 2005 y versiones posteriores:

with Records AS(select row_number() over(order by datecreated) as 'row', * 
       from Table) 
select * from records 
where row=5 

Puede cambiar el orden para determinar cómo ordenar los datos para obtener la quinta fila.

Probado en mi instalación local: Microsoft SQL Server 2005 - 9.00.4053.00 (X64) 26 de mayo de 2009 14:13:01 Copyright (c) 1988-2005 Microsoft Corporation Developer Edition (64 bits) en Windows NT 6.1 (Build 7600:)

+0

Funciona muy bien, pero solo para SQL 2008. – mwigdahl

+2

No funciona bien en SQL 2005, que es lo que estoy ejecutando – JoshBerke

+0

Mi error, de 2005 en adelante, lo admite. Gracias Josh! – mwigdahl

8

A partir de 2005, la función ROW_NUMBER() está disponible.

SELECT * FROM 
(
    SELECT r.*, ROW_NUMBER() OVER (ORDER BY SomeField ASC) AS RowNum 
) sorty 
WHERE RowNum = 5 
0

un poco más/diferente de lo que pidieron, pero aquí es un poco de materia: Digamos que usted tiene una necesidad de encontrar la enésima fila de una tabla, en una secuencia de fecha y hora específica e introduzca un valor entre en otra tabla si su identificador único no está ya en la otra tabla. Esto obtiene el valor de esas primeras tablas enésima fila. myuniquecol es un identificador/Col que identifica el grupo de filas que todos tienen el mismo valor en la primera tabla que tienen valores MyDateTime únicas

(SELECT TOP 1 mycol FROM 
    (SELECT TOP 5 * FROM mytable 
     WHERE mytable.myuniquecol NOT IN (select myuniquecol from myothertable) 
     AND mytable.myuniquecol = myuniquecol 
     ORDER BY myuniquecol asc, mydatetime desc 
    ) AS me 
    ORDER BY myuniquecol desc, mydatetime asc 
) AS mycolnew 

Esto es útil para encontrar la enésima fila en una tabla, e insertarlo en como el n-ésimo col en otra mesa.

tabla1: myuniquecol, mycol, MyDateTime

tabla2: myuniquecol, mycol1, mycol2, mycol3 ...

debería funcionar en cualquier SQL :)

NOTA: mitabla tiene una columna llamada mycol

EDIT: sacó algunas cosas debido a la limitación de SQL Server en TOP

+0

FYI, lo hizo de esta manera porque la pregunta era un tanto ambigua. –

3

Puede usar Common Table Expression (CTE) y Window Function, ROW_NUMBER() (compatibilidad de SQL 2005) para resolver su problema.

Supongamos que el nombre de la tabla es tableOne y tiene tres columnas (col1, col2, col3)

hacer que la definición completa, es necesario especificar el orden con respecto a la que desea que las filas numeradas . Los siguientes scripts deberían ayudarlo a obtener la enésima fila de la tabla.


--table definition 
create table tableOne 
(
    col1 varchar(10) 
    ,col2 varchar(10) 
    ,col3 varchar(10) 
) 
go 
-- sample data creation 
insert into tableOne VALUES ('c11','c12','c13') 
insert into tableOne VALUES ('c21','c22','c23') 
insert into tableOne VALUES ('c31','c32','c33') 
insert into tableOne VALUES ('c41','c42','c43') 
insert into tableOne VALUES ('c51','c52','c53') 
insert into tableOne VALUES ('c61','c62','c63') 
go 
-- obtaining nth row using CTE and Window Function 
WITH NthRowCTE AS 
(
    SELECT 
     ROW_NUMBER() OVER (ORDER BY col1) AS RNum 
     , * 
    FROM tableOne 
) 
SELECT * FROM NthRowCTE WHERE RNum = 5 
GO 

CON CTE y función de ventana, usted tiene la flexibilidad completa a los datos de salida de la manera deseada.

1

Si está utilizando SQL Serever 2005 o superior, puede usar la funcionalidad CTE.

contrario, puede utilizar esta consulta sencilla

SELECT TOP 1 EmpID 
FROM (SELECT TOP 5 EmpID FROM EmpMaster ORDER BY Salary) T 
ORDER BY Emp DESC 
0

SIMPLE

- volver primer registro

seleccionar * de títulos a en la que 1 = (select count (title_id) de los títulos b donde a.title_id> = b.title_id)

- volver segundo disco y así sucesivamente seleccionar * de títulos en un 2 = (select count (title_id) de títulos b donde a.title_id> = b.title_id)

Cuestiones relacionadas