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

时间:2015-08-25 15:21:34

标签: 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最近(最高)年份对应的Name,所以:

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

我假设有一些涉及的WITH / AS语句,一个GROUP BY,一个MAX(),也许是一个视图?我不确定。有什么帮助吗?

1 个答案:

答案 0 :(得分:2)

使用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