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;