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