2011-01-25 9 views
24

¿Cómo puedo devolver cada enésimo registro desde una sub consulta basada en un parámetro numérico que yo proporciono?Fila de retorno de cada nécimo registro

Por ejemplo, puede tener la siguiente consulta:

SELECT 
    Id, 
    Key 
FROM DataTable 
WHERE CustomerId = 1234 
ORDER BY Key 

por ejemplo

El resultado subconsulta puede ser similar al siguiente:

Row Id Key 
1 1 A3231 
2 43 C1212 
3 243 E1232 
4 765 G1232 
5 2432 E2325 
... 
90 3193 F2312 

Si paso en el número 30, y el conjunto sub resultado de la consulta contenía 90 registros, me gustaría recibir el 30 de, 60a y 90th fila.

Si paso en el número 40, y el conjunto de resultados contenía 90 registros, me gustaría recibir la fila 40a y 80a.

Como nota al margen, para información de antecedentes, esto se está utilizando para capturar la clave/identificación de cada enésimo registro para un control de búsqueda.

+0

Tenga en cuenta que sin un 'ORDER BY', obtendrá los resultados en orden aleatorio, por lo que también puede limitarse al * primero * N resultados. –

+0

@Oli Gracias, se olvidó de agregar eso. Los resultados siempre estarán en el mismo orden y nunca cambiarán. –

Respuesta

43

Aquí es donde ROW_NUMBER puede ayudar. Requiere una cláusula de orden por pedido, pero está bien porque está presente un pedido por pedido (y se requiere para garantizar un pedido en particular).

SELECT t.id, t.key 
FROM 
(
    SELECT id, key, ROW_NUMBER() OVER (ORDER BY key) AS rownum 
    FROM datatable 
) AS t 
WHERE t.rownum % 30 = 0 -- or % 40 etc 
ORDER BY t.key 
+2

@pst: la función de ventana 'ROW_NUMBER' no es una extensión TSQL patentada. Es parte del estándar SQL (desde SQL2003, creo). – LukeH

+0

se parece a esto http://my.safaribooksonline.com/book/databases/sql/0596004818/sql-functions/sqlnut2-chp-4-sect-3 –

7

No tiene que usar el número de fila, cualquier número entero lo hará. En la mayoría de las tablas, tenemos un campo de autonumeración. Para simplificar, lo llamaré ID. Para mostrar todos los registros de 13:

Select ID, LastName, FirstName FROM Users WHERE ID%13 = 0 ORDER BY ID 
+6

Si se borra una fila, ¿presumiblemente esto ya no funcionará? –

+2

Gracias, esta solución simple funciona para mis propósitos (estoy construyendo un conjunto de datos de prueba general para que ninguno de los elementos eliminados no me preocupe) – Kmeixner

+1

Esto no ayuda si la consulta se filtra con cláusulas WHERE, ya que ID salta aleatoriamente . – envision

1

Seleccionar B.name a partir de (Seleccionar row_number() sobre (orden de pedido) como row_num, A.name a partir de (Seleccionar nombre, 'P1' como el pedido de [dbo] . [every_2nd_record]) A) B donde B.row_num% 2 = 0

Cuestiones relacionadas