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

Postgresql 如何在Postgres中找到与另一列的最大值相对应的一列的值,postgresql,aggregate-functions,Postgresql,Aggregate Functions,我相信这已经在其他地方被问到和回答过了,但我很难简明扼要地表达这个问题。以一个简化的表格为例: ID Year Name -------------------- 1 2015 A 1 2014 B 1 2016 C 2 2011 D 2 2002 E 2 2014 F 我想运行一个查询,返回每个ID的最近(最高)年份对应的名称,因此: ID Name -----

我相信这已经在其他地方被问到和回答过了,但我很难简明扼要地表达这个问题。以一个简化的表格为例:

ID     Year     Name
--------------------
1      2015     A
1      2014     B
1      2016     C
2      2011     D
2      2002     E
2      2014     F
我想运行一个查询,返回每个ID的最近(最高)年份对应的名称,因此:

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

我假设有一些WITH/AS语句,一个GROUP BY,一个MAX(),可能是一个视图?不过我不确定。有什么帮助吗?

使用
distinct on()

对于标准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示例:

这里的年份在哪里(在使用DISTINCT ON()的解决方案中)?也就是说,我不应该以某种方式按年份进行排序吗?在我的实际示例中,有比这些更多的列,那么它如何知道按哪个进行排序呢?@StephenSmith:嗯,您预期的输出只显示id和名称作为输出列,所以我使用了。但在这两种解决方案中,您可以添加任意数量的其他列。第一个必须按照
id,name desc
作为第一个排序标准进行排序。您可以根据需要在这些列之后添加排序列。您可以将
year desc
添加到
ORDER BY
以执行您想要的操作。
select id, name
from (
  select id, name, 
         max(name) over (partition by id) as max_name
  from the_table
) t 
where name = max_name;