我有一个软件包更新的元数据表。该表包含列 id、name、version
。我想选择名称是某个给定名称列表之一且版本是具有该名称的所有行的最大值的所有行。
例如,给定这些记录:
+----+------+---------+
| id | name | version |
+----+------+---------+
| 1 | foo | 1 |
| 2 | foo | 2 |
| 3 | bar | 4 |
| 4 | bar | 5 |
+----+------+---------+
还有一个任务“给我记录“foo”和“bar”的最高版本,我希望结果是:
+----+------+---------+
| id | name | version |
+----+------+---------+
| 2 | foo | 2 |
| 4 | bar | 5 |
+----+------+---------+
到目前为止,我想到的是使用嵌套查询:
SELECT *
FROM updates
WHERE (
id IN (SELECT id
FROM updates
WHERE name = 'foo'
ORDER BY version DESC
LIMIT 1)
) OR (
id IN (SELECT id
FROM updates
WHERE name = 'bar'
ORDER BY version DESC
LIMIT 1)
);
这行得通,但感觉不对。如果我想过滤更多的名字,我必须多次复制整个子查询。有更好的方法吗?
最佳答案
select distinct on (name) id, name, version
from metadata
where name in ('foo', 'bar')
order by name, version desc
关于sql - 选择满足某些条件且在某一列中具有最大值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16119906/