2011-03-09 12 views
8

He creado una consulta de búsqueda compleja en SQL 2008 que devuelve datos ordenados por grupos, y la consulta misma tiene funciones de paginación y clasificación, pero en lugar de al devolver un número determinado de registros en función de las opciones de búsqueda, debe devolver un número determinado de grupos (por lo que la cantidad de registros variará).Cómo agregar un número de secuencia para grupos en una consulta SQL sin tablas temporales

Actualmente estoy haciendo esto mediante el uso de tablas temporales (la primera tabla temporal crea una lista de los grupos que se seleccionarán como parte de la búsqueda, y luego los numera ... y la segunda consulta se une a esta tabla a la búsqueda real ... por lo tanto, termina ejecutando la consulta de búsqueda dos veces).

Lo que estoy buscando es una forma más eficiente de hacerlo utilizando algunas de las nuevas funciones en SQL 2008 (que no requerirían el uso de tablas temporales).

Si puedo conseguir los datos en un formato como este, estaría puse ...

 
Record Group  GroupSequence 
-------|---------|-------------- 
1  Chickens 1 
2  Chickens 1 
3  Cows  2 
4  Horses 3 
5  Horses 3 
6  Horses 3 

Cualquier ideas sobre cómo lograr esto con una sola consulta en SQL 2008, sin necesidad de utilizar tablas temporales ?

+0

¿Qué columnas son de datos y cuáles necesitan los valores calculados? – RichardTheKiwi

+0

La primera y la segunda columna ("Grabar [Número]" y "Grupo") provienen de datos. La columna "Secuencia de grupo" se calcularía mediante la consulta. – Jacob

Respuesta

10

datos de la muestra

create table sometable([group] varchar(10), id int, somedata int) 
insert sometable select 'Horses', 9, 11 
insert sometable select 'chickens', 19, 121 
insert sometable select 'Horses', 29, 123 
insert sometable select 'chickens', 49, 124 
insert sometable select 'Cows', 98, 1 
insert sometable select 'Horses', 99, 2 

Consulta

select 
    Record = ROW_NUMBER() over (order by [Group], id), 
    [Group], 
    GroupSequence = DENSE_RANK() over (order by [Group]) 
from sometable 

Salida

Record    Group  GroupSequence 
-------------------- ---------- -------------------- 
1     chickens 1 
2     chickens 1 
3     Cows  2 
4     Horses  3 
5     Horses  3 
6     Horses  3 
+0

Agradable, muestra cómo funcionan row_number y dense_rank. –

+0

¡Hermoso! DENSE_RANK() es exactamente lo que estaba buscando, y parece ser mucho más eficiente que las tablas temporales que estaba usando. – Jacob

+0

Justo lo que el documento ordenó para mí - DENSE_RANK() – rageit

1

Sin más detalles acerca de las tablas que tiene, yo diría mirada en CTE consultas y la función row_number ... algo a lo largo de las líneas de:

;with groups as (
    select top 10 name, row_number() over(order by name) 'sequence' 
    from table1 
    group by name 
    order by name 
) 
select row_number() over(order by g.name) 'Record', 
    g.name 'GroupName', 
    g.sequence 'GroupSequence' 
from groups 
+0

A los efectos de la paginación, he modificado la mayoría de mis consultas de búsqueda para utilizar esta nueva notación "con como", que parece ejecutarse mucho más rápido que las tablas @ o # temp. – Jacob

+0

Tenga cuidado, porque eso no siempre será cierto. La notación de consulta 'with', en este uso, es como una subconsulta nombrada (que puede usarse varias veces) ... por lo tanto, a veces, una tabla temporal o una variable de tabla serán mejores opciones. – chezy525

Cuestiones relacionadas