Ranking de resultados en agrupación

04/12/2007 - 10:41 por Vicent | Informe spam
Hola a todos

Estoy tratando de hacer una consulta agrupada de, por ejemplo
oficinas, donde aparezcan datos de clientes al estilo "sácame los 10
clientes más rentables de cada una de mis oficinas".

El problema lo tengo en el hecho que no encuentro una manera fácil de
hacerlo, pues en un caso más sencillo sería simplemente poner un TOP x
combinado con una ordenación para que sacara los 10 clientes más
rentables, pero eso actúa sobre la totalidad de registros devueltos y
no sobre la agrupacion. Yo necesitaría los 10 más rentables de la
Oficina 1, los 10 más rentables de la oficina 2, etc.

¿Alguien tiene alguna idea?

Saludos
 

Leer las respuestas

#1 Alejandro Mesa
04/12/2007 - 15:44 | Informe spam
Vicent,

Cual es la version de SQL Server que usas?

Si estas usando SS 2005, puedes usar las nuevas funciones de ranking o el
nuevo operator APPLY.

with cte
as
(
select
o.oficina_id,
c.cliente_id,
c.rentabilidad,
row_number() over(partition by c.oficina_id order by c.rentabilidad
DESC, c.cliente_id ASC) as rn
from
oficina as o
inner join
cliente as c
on o.oficina_id = c.oficina_id
)
select *
from cte
where rn < 11


select o.oficina_id, c.cliente_id, c.rentabilidad
from oficina as c
cross apply
(
select top 10 a.cliente_id, a.rentabilidad
from cliente as a
where a.oficina_id = o.oficina_id
order by a.rentabilidad desc, a.cliente_id asc
) as c


AMB


"Vicent" wrote:


Hola a todos

Estoy tratando de hacer una consulta agrupada de, por ejemplo
oficinas, donde aparezcan datos de clientes al estilo "sácame los 10
clientes más rentables de cada una de mis oficinas".

El problema lo tengo en el hecho que no encuentro una manera fácil de
hacerlo, pues en un caso más sencillo sería simplemente poner un TOP x
combinado con una ordenación para que sacara los 10 clientes más
rentables, pero eso actúa sobre la totalidad de registros devueltos y
no sobre la agrupacion. Yo necesitaría los 10 más rentables de la
Oficina 1, los 10 más rentables de la oficina 2, etc.

¿Alguien tiene alguna idea?

Saludos

Preguntas similares