0

我有一个如下所示的数据库表:

| ID | TITLE | VERSION | 
| 1  | file1 |    1    |
| 2  | file2 |    1    |
| 3  | file1 |    2    |
| 4  | file2 |    2    |

我需要一个返回第 3 行和第 4 行的 SQL 查询,因为它们是 file1 和 file 2 的最新版本。

如果我在如下所示的表上运行查询:

| ID | TITLE | VERSION | 
| 1  | file1 |    1    |
| 2  | file2 |    1    |
| 3  | file1 |    2    |
| 4  | file2 |    2    |
| 5  | file3 |    1    |

它应该返回第 3,4 和 5 行,因为“file3”version1 是 file3 的最新版本。

我知道我需要在 SQL 中使用“MAX”函数,但是我被“GROUP BY”关键字抛弃了。我不是很熟悉如何使用它。

将不胜感激所有/任何建议!

我们正在使用 Oracle 11g。

4

2 回答 2

3

实际上,使用子查询来获取MAX按 分组的版本, TITLE然后将其结果与您的表连接以获得ID

SELECT t.*
FROM tbl t INNER JOIN 
     (SELECT title, MAX(version) version
      FROM tbl
      GROUP BY title
     ) max_t ON (t.version = max_t.version AND t.title = max_t.title);

演示

于 2012-09-12T23:20:04.587 回答
0

实际上,最好的方法是使用排名函数:

select id, title, version
from (select t.*
             row_number() over (partition by id order by version desc) as seqnum
      from t
     ) t
where seqnum = 1

函数 row_number() 在 Oracle 中称为解析函数。它分配数字 1, 2, 3 。. . 到每一行,基于分区子句。数字从每个 id 开始,最大的版本从 1 开始。

于 2012-09-13T00:54:40.353 回答