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