MySQL - Sacar sólo el registro máximo para un campo concreto

 
Vista:
sin imagen de perfil

Sacar sólo el registro máximo para un campo concreto

Publicado por PerryMason1982 (11 intervenciones) el 21/01/2015 14:38:22
Buenas, a ver si podéis ayudarme, Gracias de antemano:))

Tiro esta query:


select operadores.nombre as carrier, empresas.nombre as company, concat_ws('-', cast(pais as char), cast(id_filtro as char)) as id_offer, sum(imp) as imp

from logs.imp
inner join logs.empresas
on empresas.id = imp.id_empresa
inner join logs.operadores
on operadores.id = imp.id_carrier

where fecha > 20150119
and (concat_ws('-', cast(pais as char), cast(id_filtro as char)) = 'aosxin-1'
or concat_ws('-', cast(pais as char), cast(id_filtro as char)) = 'tksxit-7')





group by 1,2,3

order by imp desc
limit 10;


y obtengo estos resultados:

CARRIER COMPANY ID_OFFER PRINTS
Reliance MobSuite aosxin-1 42444
Wifi Xtra Kimia aosxin-1 41683
Wifi CN Sexorteens.com - Luiz Aranha aosxin-1 40631
Wifi Reporo 2 aosxin-1 40436
Wifi Traffic Force aosxin-1 37983
Wifi MobSuite aosxin-1 30135
Wifi KM bosmobi.net aosxin-1 16374
Wifi Plug Rush Redirect aosxin-1 11874
Reliance Reporo 2 aosxin-1 7605
Reliance CN Sexorteens.com - Luiz Aranha aosxin-1 7510



Pero como puedo obtener sólo un registro para cada id_offer, en que me salga el máximo de prints?


Gracias de antemano! si no está muy claro, puedo especificarme mejor
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Sacar sólo el registro máximo para un campo concreto

Publicado por xve (1151 intervenciones) el 21/01/2015 19:40:19
Hola, la manera es utilizando max() y group by... pero no se ver donde aparece el campo prints en la consulta... Esos títulos son de esa query?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sacar sólo el registro máximo para un campo concreto

Publicado por PerryMason1982 (11 intervenciones) el 22/01/2015 11:08:39
Perdon.. no.. esos titulos no son de esa query, es que los copie a mano (chapuceramente debo admitir)

Sería así:


CARRIER COMPANY ID_OFFER IMP
Reliance MobSuite aosxin-1 42444
Wifi Xtra Kimia aosxin-1 41683
Wifi CN Sexorteens.com - Luiz Aranha aosxin-1 40631
Wifi Reporo 2 aosxin-1 40436
Wifi Traffic Force aosxin-1 37983
Wifi MobSuite aosxin-1 30135
Wifi KM bosmobi.net aosxin-1 16374
Wifi Plug Rush Redirect aosxin-1 11874
Reliance Reporo 2 aosxin-1 7605
Reliance CN Sexorteens.com - Luiz Aranha aosxin-1 7510



Lo de max() como lo metería? porque yo no puedo poner max(sum(imp)), no me lo permite. ¿Es cómo otra subquery verdad?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sacar sólo el registro máximo para un campo concreto

Publicado por Josue Rodriguez (11 intervenciones) el 05/02/2015 13:24:13
Hola chicos,

¿Me podéis ayudar con esto entonces? Si fuera así, os estaría muy agradecidos, sería un paso importante en mi trabajo,

Entonces, yo meto esta query por ejemplo para sacar datos de una tabla:

select bandera as pais, id_so, sum(imp) as imp
from logs.imp
where fecha = 20150204
group by 1,2
order by 3 desc
limit 100;

Y obtengo estos resultados:

pais id_so imp
MX 3 3294051
BR 3 2901619
IN 3 2559569
US 3 1817126
ID 3 1420682
ES 3 1184289
CO 3 883913
IT 3 872332
AR 3 852510
US 1 770563
US 0 608491
IN 10 486545
CL 3 451320
MY 3 449326
DE 3 374149
IN 6 368657
RU 3 345445
SA 3 319328
PE 3 316833
TH 3 289185
MX 1 284414

El problema es: ¿cómo puedo hacer para que me salga el valor máximo para cada país? Es decir, sólo un valor para cada país, el máximo?

Gracias de antemano!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Sacar sólo el registro máximo para un campo concreto

Publicado por xve (1151 intervenciones) el 05/02/2015 16:11:28
Hola Josue, se te repiten porque agrupas por el primer y segundo valor (group by 1,2)... agrupa únicamente por país (group by 1)

Coméntanos, ok?

Si no puedes modificar el group by, tendras que hacer un group by a posterior... algo así:
1
2
3
4
5
6
7
8
9
10
SELECT pais,id_do,max(imp) FROM
(
select bandera as pais, id_so, sum(imp) as imp
from logs.imp
where fecha = 20150204
group by 1,2
order by 3 desc
limit 100;
)
GROUP BY pais

Coméntanos si te sirve, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sacar sólo el registro máximo para un campo concreto

Publicado por josue (11 intervenciones) el 05/02/2015 16:19:51
Gracias xve,

el problema es que si hago lo que me dices, los datos que obtengo no tienen sentido, quiero decir ,

por ejemplo obtengo este valor:

pais id_so imp
MX 6 4198915

Y esto no es cierto que para Méjico y el id_so número 6 haya 4.198.915 de impresiones.... porque se con certeza que hay 50.250 impresiones
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sacar sólo el registro máximo para un campo concreto

Publicado por josue (11 intervenciones) el 09/02/2015 14:38:25
Buenos días!

Perdon la insistencia, a alguien se le ocurrio algo¿?

Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 4 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Sacar sólo el registro máximo para un campo concreto

Publicado por Hugo QN (32 intervenciones) el 12/02/2015 20:09:20
hola, haslo de esta manera.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT	datos.*
FROM	(SELECT	bandera as pais, id_so, sum(imp) AS imp
		FROM	logs.imp
		WHERE	fecha = 20150204
		GROUP	BY bandera, id_so
		ORDER	BY 3 DESC
		limit 100) datos
INNER JOIN (SELECT	pais, max(imp)
			FROM	(SELECT	bandera as pais, id_so, sum(imp) AS imp
					FROM	logs.imp
					WHERE	fecha = 20150204
					GROUP	BY bandera, id_so
					ORDER	BY 3 DESC
					limit 100) solomaximo
			GROUP BY pais) Maximo
	ON datos.pais = Maximo.pais

espero te ayude .
saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sacar sólo el registro máximo para un campo concreto

Publicado por josue (11 intervenciones) el 13/02/2015 14:41:33
Gracias por tu inestimable ayuda HUgo!

Una cosa, solo,

Me salen exactamente los mismos datos tanto si tiro esta subquery:

SELECT bandera as pais, id_so, sum(imp) AS imp FROM logs.imp
WHERE fecha = 20150204
GROUP BY bandera, id_so
ORDER BY 3 DESC
limit 10000;

como si tiro la query entera que me has pasado!:

SELECT datos.*
FROM (SELECT bandera as pais, id_so, sum(imp) AS imp FROM logs.imp
WHERE fecha = 20150204
GROUP BY bandera, id_so
ORDER BY 3 DESC
limit 10000) datos
INNER JOIN (SELECT pais, max(imp) FROM (SELECT bandera as pais, id_so, sum(imp) AS imp
FROM logs.imp
WHERE fecha = 20150204
GROUP BY bandera, id_so
ORDER BY 3 DESC
limit 10000) solomaximo
GROUP BY pais)
Maximo ON datos.pais = Maximo.pais;

¿sabes porqué podría ser, tio?

Graciass!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 4 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Sacar sólo el registro máximo para un campo concreto

Publicado por Hugo QN (32 intervenciones) el 16/02/2015 19:36:07
hola Josue.
pasame unos 5 linea de la data que tienes e indicame como deberia ser el resultado a mostrar de esos 5 lineas.

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Sacar sólo el registro máximo para un campo concreto

Publicado por MMan (3 intervenciones) el 16/02/2015 20:10:51
hola


si haces...

GROUP BY bandera, id_so

tendrias :::

MX 1 valor1
MX 2 valor2
MX 3 valor3
MX 4 valor4

------
si tuvieses
MX 1 1
MX 1 1
MX 2 2
MX 2 2

y haces
Select sum(imp) GROUP BY bandera, id_so

tendrias
MX 1 2
MX 2 4

---
y por ultimo si haces
select max(sumaimp) from
(Select sum(imp) as sumaimp GROUP BY bandera, id_so )
GROUP BY pais

tendrias
MX 2 4

---------
que es lo mismo que te puso xve lineas arriba
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Sacar sólo el registro máximo para un campo concreto

Publicado por josue (11 intervenciones) el 17/02/2015 17:37:19
Gracias por vuestra ayuda chicos,

Pues hugo, si yo tuviera esta tabla:

BANDERA SO IMP
MX 3 3.000.000
MX 1 500.000
IN 0 120.000
IN 2 2.000.000
IN 1 100.000

El resultado que me tendría que salir debería ser este:

BANDERA SO IMP
MX 3 3.000.000
IN 2 2.000.000


Que es el mayor para cada valor país, independientemente de con que SO se haya hecho,

Gracias, y un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 4 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

Sacar sólo el registro máximo para un campo concreto

Publicado por Hugo QN (32 intervenciones) el 19/02/2015 00:56:39
Hola Josue, aqui tienes 2 formas de hacer.

1
2
3
4
5
6
7
SELECT Dato2.BANDERA, SO, Dato2.IMP
FROM (SELECT BANDERA, SO, SUM(IMP) AS IMP FROM datos GROUP BY BANDERA, SO) dato1
INNER JOIN (SELECT BANDERA, MAX(IMP) AS IMP
			FROM (SELECT BANDERA, SO, SUM(IMP) AS IMP FROM datos GROUP BY BANDERA, SO) dato
			GROUP BY BANDERA) Dato2
	ON Dato2.BANDERA = dato1.BANDERA AND dato2.IMP = dato1.IMP
ORDER BY 1, 2

ó

1
2
3
4
5
6
7
8
9
SELECT Dato2.BANDERA, datos.SO, Dato2.IMP
FROM datos
INNER JOIN (SELECT BANDERA, MAX(IMP) AS IMP
			FROM (SELECT BANDERA, SO, SUM(IMP) AS IMP FROM datos GROUP BY BANDERA, SO) dato
			GROUP BY BANDERA) Dato2
	ON Dato2.BANDERA = datos.BANDERA
GROUP BY Dato2.BANDERA, datos.SO, Dato2.IMP
HAVING SUM(datos.IMP) = dato2.IMP
ORDER BY 1, 2

solo tienes que pensar un poquito, pero si ya estás bloqueado no saldrá por mas que sea facil, eso nos pasa aveces.

saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar