选择满足某些条件并在某一列中具有最大值的行

ada*_*dam 4 sql postgresql greatest-n-per-group

我有一个用于更新软件包的元数据表。该表有列id, name, version。我想选择名称是某些给定名称列表之一的所有行,并且版本是具有该名称的所有行的最大值。

例如,给定这些记录:

+----+------+---------+
| id | name | version |
+----+------+---------+
| 1  | foo  | 1       |
| 2  | foo  | 2       |
| 3  | bar  | 4       |
| 4  | bar  | 5       |
+----+------+---------+
Run Code Online (Sandbox Code Playgroud)

还有一个任务“给我最高版本的记录“foo”和“bar”,我希望结果是:

+----+------+---------+
| id | name | version |
+----+------+---------+
| 2  | foo  | 2       |
| 4  | bar  | 5       |
+----+------+---------+
Run Code Online (Sandbox Code Playgroud)

到目前为止,我想出的是使用嵌套查询:

+----+------+---------+
| id | name | version |
+----+------+---------+
| 1  | foo  | 1       |
| 2  | foo  | 2       |
| 3  | bar  | 4       |
| 4  | bar  | 5       |
+----+------+---------+
Run Code Online (Sandbox Code Playgroud)

这有效,但感觉不对。如果我想过滤更多的名字,我必须多次复制整个子查询。有一个更好的方法吗?

Clo*_*eto 5

select distinct on (name) id, name, version
from metadata
where name in ('foo', 'bar')
order by name, version desc
Run Code Online (Sandbox Code Playgroud)