如何在Postgres中找到对应于另一列的最大值的列的值



我相信这个问题已经在其他地方问过并回答过了,但是我很难简洁地表达这个问题。以一个简化的表为例:

ID     Year     Name
--------------------
1      2015     A
1      2014     B
1      2016     C
2      2011     D
2      2002     E
2      2014     F

我想运行一个查询,返回与每个ID最近(最高)年份对应的Name,因此:

ID     Name
-----------
1      C
2      F

我假设有一些WITH/AS语句,一个GROUP BY,一个MAX(),也许是一个视图?不过我不确定。任何帮助吗?

使用distinct on()的Postgres专用解决方案

select distinct on (id) id, name
from the_table 
order by id, name desc;

对于标准SQL,这将使用窗口函数来完成:

select id, name
from (
  select id, name, 
         max(name) over (partition by id) as max_name
  from the_table
) t 
where name = max_name;

distinct on解决方案通常比使用窗口函数的解决方案快,但它不具有可移植性。

SQLFiddle示例:http://sqlfiddle.com/#!15/c4e74/1

最新更新