请参见下面的示例,以更好地理解我的问题:
表“名称”中的列:
目标是获得每个ID的最大版本。输出应为:
有哪些可能的方法来实现?例如。在桌子上使用自我联接?
谢谢。
答案 0 :(得分:0)
如果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和版本的组合是唯一的,这似乎是合理的。如果不是,那么您需要决定如何打破平局。