sql - Oracle SQL Developer:动态选择列中的值 = MAX 值的行
问题描述
请参阅下面的示例以更好地理解我的问题:
表“名称”中的列:
目标是获得每个 ID 的最大版本。输出应该是:
有哪些可能的方法来实现这一目标?例如在桌子上使用自连接?
提前致谢。
解决方案
如果 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 by
。order by
这假设 ID 和版本的组合是唯一的,这似乎是合理的。如果不是,那么您需要决定如何打破关系。
推荐阅读
- python - 将 OneHot 编码的数据从数组转换为数字序列
- powershell - PSZoom 输出被截断
- git - Git远程到自己的服务器
- php - 如何在 laravel 提供者的模型 config.php 文件中动态地将变量名传递给模型
- django - 为什么我不能通过 django-admin 使用我的 Django 实用程序
- java - 如何正确地将 int 值从 firebase 实时数据库检索到 textview?
- azure - 以编程方式进行带有排除项的 Azure 策略分配
- python - 如何在 Pandas Dataframe 中应用 If Else 语句?
- azure - 使用 HTTP 触发器调用逻辑应用时出现 DirectApiRequestHasMoreThanOneAuthorization 错误
- c - read() 不读取套接字缓冲区上的剩余字节