2015-02-10 5 views
0

Предположим, я следующая таблица с именем image_play и имеют следующие графы & COLSполучить максимальную дату на основе значения столбца

+-------------------------------------------+ 
|image_name | image_category | image_date | 
+-------------------------------------------+ 
|a.jpg  | WSA    | 2015-02-10 | 
|b.jpg  | WSP    | 2015-02-09 | 
|c.jpg  | GSST   | 2015-02-09 | 
|d.jpg  | WSA    | 2015-02-09 | 
|e.jpg  | GSST   | 2015-02-08 | 
|f.jpg  | WSP    | 2015-02-08 | 
+-------------------------------------------+ 

Из этой таблицы я хочу, чтобы выбрать MAX дату для каждого image_category. так что результат будет

a.jpg  | WSA    | 2015-02-10 
b.jpg  | WSP    | 2015-02-09 
c.jpg  | GSST   | 2015-02-09 

Я уже попробовать это сделать запрос для каждой категории, как так:

SELECT * FROM image_play t JOIN (SELECT MAX(image_date) AS MAXDATE FROM image_play WHERE image_category='GSST')t2 ON t.image_date=t2.MAXDATE 

Но это не работает. пожалуйста, помогите мне .. многое.

ответ

0
select ipl.* 
from 
(select max(ip.image_date) max_date, ip.image_category from image_play ip 
group by ip.image_category) ipx 
join image_play ipl on ipl.image_category=ipx.image_category 
and ipl.image_date=ipx.max_date 
+0

awesome! большое спасибо, вы спасли мой день –

1

Postgres конкретных и наиболее значительно быстрее решением является использование distinct on:

select distinct on (image_category) image_name, image_category, image_date 
from image_play 
order by image_category, image_date DESC 

Очень часто с помощью оконной функции также быстрее, чем при использовании автообъединение на производной таблице (это стандарт SQL, а не Postgres).

select image_name, image_category, image_date 
from (
    select image_name, image_category, image_date, 
     row_number() over (partition by image_category order by image_date desc) as rn 
) t 
where rn = 1 
order by image_category