2012-09-19 13 views
5

Ho una domanda che sembra thos:Come fare un gruppo dalla clausola con un massimo

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 

Ad es Ho 4 righe: CREATIVE_ID insert_date, creative_object

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

La query sta tornando tutte le righe.

ho bisogno di tornare

june13 a b 
june13 c d 

Come faccio a modificare la query?

+0

sarebbe 'group by MAX (insert_date)'? –

+2

rimuovere insert_date dal gruppo by e riprovare e dirci cosa sta succedendo. – CRDave

risposta

5

Basta togliere il insert_date dalla clausola 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

Sei sicuro che questo funzionerà ??? – WojtusJ

0

Se avete solo bisogno di sapere, ciò che il termine massimo per la particolare creative_id e creative_object è, basta rimuovere insert_date da GROUP BY clausola , streghe causerà selezionare la data massima per ogni gruppo, inoltre cambierei la condizione IN per renderlo più chiaro (anche se in questo caso particolare non fa una grande differenza), come quello:

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

Il problema qui è che la data di inserimento è definita come una stringa. Dovrebbe essere definito come un tipo di data in modo che Max() possa calcolare l'ordine corretto. Supponiamo che ci sia un'altra data come il 05 agosto come data di inserimento, quindi Max restituirebbe il 13 giugno. Ricorda che nell'ordinamento delle stringhe c'è una differenza tra giugno 13 e 13 giugno.

Quando max (un'espressione) l'espressione non dovrebbe essere nel gruppo per clausola.

GROUP BY insert_date, creative_id, creative_object

Spero che questo aiuti.

Problemi correlati