根据列值获取最大日期

时间:2015-02-10 05:21:36

标签: sql postgresql greatest-n-per-group

假设我有一个名为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

但它不起作用。请帮帮我......谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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