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

标签 sql postgresql greatest-n-per-group

我有一个软件包更新的元数据表。该表包含列 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/

相关文章:

mysql - 如何优化此 MySQL 报告查询的时间范围和聚合?

mysql - 服务器双撇号时的 SQL 注入(inject)

sql - 简单的 sql(我希望!)

SQL:过滤具有最大值的行

列名中的 MySQL '/'

sql - 如何在 SQL Server 的存储过程中从 xml 节点创建游标?

Python:将数据从 CSV 导入 Postgres 时出错(错误:整数输入语法无效:)

postgresql - 在 plpgsql 中,如何退出返回记录的函数

postgresql - Postgres - 临时文件大小超过 temp_file_limit

mysql - 将原始每组最大 n 个 MySQL 查询切换到 Laravel 查询生成器