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

Preguntas similare

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

Respuesta Responder a este mensaje
#2 Vicent
05/12/2007 - 08:23 | Informe spam
On 4 dic, 15:44, Alejandro Mesa
wrote:
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




Efectivamente estoy usando SQL Server 2005.

Probaré lo que propones.

Saludos
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida