如果 ID 的名称始终相同,则这是简单聚合;以样本数据作为 CTE:
-- CTE for sample data - same names
with your_table (id, name, version) as (
select 1, 'Name1', 1 from dual
union all select 1, 'Name1', 2 from dual
union all select 1, 'Name1', 3 from dual
union all select 2, 'Name2', 1 from dual
union all select 2, 'Name2', 2 from dual
)
-- actual query
select id,
name,
max(version) as version
from your_table
group by id, name
order by id;
ID NAME VERSION
---------- ----- ----------
1 Name1 3
2 Name2 2
如果名称可能不同,并且您想查看与每个 ID 的最大值对应的名称,则可以使用 last 函数:
-- CTE for sample data - different names
with your_table (id, name, version) as (
select 1, 'Name1', 1 from dual
union all select 1, 'Name2', 2 from dual
union all select 1, 'Name3', 3 from dual
union all select 2, 'Name1', 1 from dual
union all select 2, 'Name2', 2 from dual
)
-- actual query
select id,
max(name) keep (dense_rank last order by version) as name,
max(version) as version
from your_table
group by id
order by id;
ID NAME VERSION
---------- ----- ----------
1 Name3 3
2 Name2 2
您还可以使用子查询为每一行分配排名,如果您有很多列要检索最大版本,这可能会更方便:
select id, name, version --, other columns
from (
select id, name, version, -- other columns,
rank() over (partition by id order by version desc) as rnk
from your_table
)
where rnk = 1
order by id;
ID NAME VERSION
---------- ----- ----------
1 Name3 3
2 Name2 2
rank() 分析函数将rnk 列添加到内联视图的结果集中; partition by 和 order by 表示每个 ID 的最高版本排名为 1,然后外部查询过滤以仅显示排名为 1 的那些行。
这假设 ID 和版本的组合是唯一的,这似乎是合理的。如果不是,那么您需要决定如何打破关系。