2012-09-19 13 views
5

Tengo una consulta que se parece a los thos:Cómo hacer una cláusula GROUP BY con un máximo

SELECT max(insert_date), 
     creative_id, 
     creative_object 
FROM rtb_creatives 
WHERE adgroup_id = 'agid1608844879' 
     AND is_delete IN (0) 
GROUP BY insert_date, 
      creative_id, 
      creative_object 

P. ej Tengo 4 filas: creative_id insert_date, creative_object

june 12 a b 
june13 a b 
june 12 c d 
june13 c d 

La consulta devuelve todas las filas.

necesito devolver

june13 a b 
june13 c d 

¿Cómo modifico la consulta?

+0

¿sería 'group by MAX (insert_date)'? –

+2

elimine Insert_date from group by e inténtelo de nuevo y cuéntenos qué está pasando. – CRDave

Respuesta

5

Basta con retirar la insert_date de la cláusula GROUP BY:

SELECT max(insert_date) AS insert_date, creative_id, creative_object 
from rtb_creatives 
where adgroup_id='agid1608844879' and is_delete in (0) 
group by creative_id, creative_object 
0
create table rtb_creatives (insert_date varchar(20), creative_id char(1), creative_object char(1)); 
insert into rtb_creatives (insert_date, creative_id, creative_object) values 
('june 12', 'a', 'b'), 
('june 13', 'a', 'b'), 
('june 12', 'c', 'd'), 
('june 13', 'c', 'd') 
; 

SELECT insert_date, creative_id, creative_object 
from rtb_creatives 
where 
    adgroup_id='agid1608844879' 
    and is_delete in (0) 
    and insert_date = (select max(insert_date) from rtb_creatives) 
group by insert_date, creative_id, creative_object 
; 
+-------------+-------------+-----------------+ 
| insert_date | creative_id | creative_object | 
+-------------+-------------+-----------------+ 
| june 13  | a   | b    | 
| june 13  | c   | d    | 
+-------------+-------------+-----------------+ 
+0

¿Estás seguro de que este funcionará? – WojtusJ

0

Si sólo tiene que saber, lo que la fecha máxima para el particular, creative_id y creative_object es, sólo tiene que quitar insert_date de GROUP BY cláusula , que cambiaría la condición IN para que quede más claro (aunque en este caso particular no hace una gran diferencia), así:

SELECT max(insert_date) as insert_date, 
     creative_id, 
     creative_object 
FROM rtb_creatives 
WHERE adgroup_id = 'agid1608844879' 
     AND is_delete = 0 
GROUP BY creative_id, 
      creative_object 
0

El problema aquí es que la fecha de inserción se define como una cadena. Debe definirse como un tipo de fecha para que Max() pueda calcular el orden correcto. Supongamos que hay otra fecha como agosto 05 como fecha de inserción, entonces Max devolvería el 13 de junio. Y tenga en cuenta que en el orden de cadenas hay una diferencia en junio13 y junio 13.

Cuando max (una expresión) la expresión no debería estar en el grupo por cláusula.

GROUP BY insert_date, creative_id, creative_object

Espero que esto ayude.