Oracle SQL Developer:动态选择行,其中列中的值= MAX值

时间:2018-08-10 12:01:12

标签: sql oracle select max

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

表“名称”中的列:

Table and Columns

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

Output

有哪些可能的方法来实现?例如。在桌子上使用自我联接?

谢谢。

1 个答案:

答案 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 byorder by表示每个ID的最高版本排名为1,然后外部查询进行过滤以仅显示排名为1的那些行。

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