首页 > 解决方案 > Oracle SQL Developer:动态选择列中的值 = MAX 值的行

问题描述

请参阅下面的示例以更好地理解我的问题:

表“名称”中的列:

表和列

目标是获得每个 ID 的最大版本。输出应该是:

输出

有哪些可能的方法来实现这一目标?例如在桌子上使用自连接?

提前致谢。

标签: sqloracleselectmax

解决方案


如果 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添加到内联视图的结果集中;和表示每个 ID 的最高版本排名为 1,然后外部查询过滤以仅显示排名为 1 的那些行partition byorder by

这假设 ID 和版本的组合是唯一的,这似乎是合理的。如果不是,那么您需要决定如何打破关系。


推荐阅读