【问题标题】:Oracle SQL Developer: Dynamic Selection of Rows Where Value in Column = MAX ValueOracle SQL Developer:动态选择列中的值 = MAX 值的行
【发布时间】:2018-08-10 12:01:11
【问题描述】:

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

“名称”表中的列:

Table and Columns

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

Output

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

提前致谢。

【问题讨论】:

  • Please post text rather than images。此外,您的示例数据图像显示了 ID 为 1 的所有内容,输出表明最后两行应该有 2; ID 的所有行的名称是否始终相同?您已经知道您需要 max,它是一个聚合函数,那么您在尝试使用它时遇到什么问题?
  • 我已经修复了 ID。 ID是否相同,名称相同,版本不同(也可能有更多列不同,为简单起见,我只添加了3列)。我的目标是按每个 ID 的 MAX 版本进行过滤,在这种情况下只有两个输出行。
  • 这很重要。如果名称不同,那么大概您想显示与最大版本对应的名称?如果有更多列,解决方案可能会有所不同。
  • 你是对的。我只想要与每个 ID 的最大版本相对应的取列。否则,我可以使用 Group By 函数仅获取最大 ID 的信息。
  • 使用 row_number() 或分析 max(),如 here。请检查关于 SO 的 Oracle top-n 查询,这个问题已经被回答了数千次。

标签: sql oracle select max


【解决方案1】:

如果 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 和版本的组合是唯一的,这似乎是合理的。如果不是,那么您需要决定如何打破关系。

【讨论】:

  • 感谢@Alex Poole rank() 分析函数可以满足我的需要。
猜你喜欢
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
相关资源
最近更新 更多