Máximo y el siguiente de un grupo en una tabla de SQL

Se que eres un experto en Sql Server por aquí esta mi consulta:
Tengo una tabla Clientes con dos columnas: cliente e importe
Necesito una consulta que me retorne el máximo importe y su siguiente de cada cliente. Un ejemplo seria:
Cliente Importe
Pedro 124
Pedro 12
Juan 5
Juan 2

Te copio mi código para que lo revisen
select (select top 2 cliente,importe from clientes c2 where c1.cliente=c2.cliente)
from clientes c1

1 respuesta

Respuesta
1
A que te refieres con 'su siguiente', podrías poner el resultado de lo que deseas basándote en la data que envías para poder ayudarte mejor.
Gracias Brownsea por tu respuesta. Me explayo un poco más.
Con "siguiente" me refiero al siguiente máximo, ejemplo:
Tengo una lista con 4 nros: 45,8,76,2
El máximo y el siguiente serian 76 y 45
Espero haya quedado claro, así me ayudas a resolverlo pero en sql.
Quiero la máxima compra y la siguiente de cada cliente en particular.
Se que me vas a poder ayudar.
Gracias!
damimg
Ok, ahora si te entiendo, te envío este código donde realice las pruebas y funciona.
Espero te sirva:
Declare @data table (nom varchar(10), val int)
insert into @data values ('jose', 4)
insert into @data values ('jose', 5)
insert into @data values ('jose', 6)
insert into @data values ('su', 17)
insert into @data values ('su', 14)
insert into @data values ('su', 15)
insert into @data values ('su', 16)
insert into @data values ('su', 17)
select a.nom, a.val max1, b.val max2
from (
select nom, max(val) val
from @data
group by nom
)a inner join
(
select a.nom, max(a.val) val
from @data a inner join (select nom, max(val) val from @data group by nom)b on a.nom= b.nom and a.val<> b.val
group by a.nom
) b on a.nom= b.nom
No te olvides de cerrar la pregunta.
Gracias brownsea por tu solución, pero recién me estoy iniciando en Sql Server y hay cosas que no tengo muy claras. ¿Podrías enviarme otra solución más amena a mis conocimientos?
Si es posible quisiera que el formato de la rta de la consulta sea el siguiente:
Cliente Importe
Carlos 25
Carlos 12
Máximo 456
Máximo 312

Como veras no alteré la estructura original de la tabla, sigue habiendo 2 columnas.
Me gustaría que me des una solución para ese tipo de resultado.
Espero tu ayuda.
Te lo agradezco.
damimg
No te preocupes, te envío la solución según tus especificaciones,
declare @data table (nom varchar(10), val int)
insert into @data values ('jose', 4)
insert into @data values ('jose', 5)
insert into @data values ('jose', 6)
insert into @data values ('su', 17)
insert into @data values ('su', 14)
insert into @data values ('su', 15)
insert into @data values ('su', 16)
insert into @data values ('su', 17)
select nom, val
from (
select nom, val, rank () over ( partition by nom order by nom, val desc) ranking
from @data
)a
where ranking in (1,2)
Gracias Brownsea por la respuesta.
Viendo el código me surgieron dudas:
¿Me puedes explicar la función rank() over como trabaja y en que casos conviene usarla?
¿Lo de partition para que lo usas?
¿ranking es una variable o una función?
Realmente no puedo seguir la lógica del código y me gustaría que me lo expliques detalladamente.
Espero tu ayuda.
Gracias
damimg
Te explico el código que te puse.
La función Rank hace que puedas tener ranking según un criterio, por ejm si tengo 3 filas con dos columnas donde una es nombre y la otra apellido, y tengo dos apellidos iguales, la función rank numerará los apellidos iguales como correlativos siempre y cuando identifique como criterio de partición el apellido.
Apellido Nombre Ranking
Perez Jose 1
Perez Walter 2
Ramos Ivan 1
http://msdn.microsoft.com/es-pe/library/ms176102(SQL.90).aspx
El nombre Ranking es un alias que uso, puede ser cualquier palabra que tu quieras, luego de haber calculado el ranking, lo que hago es un select al conjunto de resultados obtenidos previamente para filtrar solo por los ranking 1 y 2 que es lo que nos interesa.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas