能否不使用子查询,通过Oracle分析函数获取最小值对应字段值?
不用子查询,仅用Oracle分析函数获取最小值对应字段值的解决方案
当然可以实现!你完全不需要依赖子查询,借助Oracle的FIRST_VALUE分析函数就能轻松达成需求。
核心思路
FIRST_VALUE函数会在指定的窗口范围内,返回排序后的第一个值。我们只需要按Col2升序排序,这样最小的Col2对应的Col1就会被优先选中,再通过DISTINCT去重,就能得到我们想要的单一结果。
实现查询语句
SELECT DISTINCT FIRST_VALUE(col1) OVER (ORDER BY col2 ASC) AS col1 FROM ds1;
完整测试验证
咱们用你提供的示例数据集来验证这个方法:
### 1014.010, Start time is: 10/30/2019 11:39:35am MYUN@MYDB-C1>>create table ds1 (col1 varchar2 (1), col2 number) 2 / Table created. Elapsed: 00:00:00.01 MYUN@MYDB-C1>>insert into ds1 (col1, col2) 2 select 'A', 1 from dual 3 union all select 'B', 2 from dual 4 union all select 'C', 3 from dual 5 union all select 'D', 4 from dual 6 union all select 'E', 4 from dual 7 union all select 'A', 10 from dual 8 / 6 rows created. Elapsed: 00:00:00.02 MYUN@MYDB-C1>>commit 2 / Commit complete. Elapsed: 00:00:00.01 MYUN@MYDB-C1>>col col1 format a10 MYUN@MYDB-C1>>SELECT DISTINCT FIRST_VALUE(col1) OVER (ORDER BY col2 ASC) AS col1 FROM ds1; COL1 ---------- A 1 row selected. Elapsed: 00:00:00.01 MYUN@MYDB-C1>>drop table ds1 2 / Table dropped. Elapsed: 00:00:00.03 The time now: 10/30/2019 11:39:36am
补充说明
- 为什么加
DISTINCT?因为FIRST_VALUE会为每一行返回相同的结果(最小值对应的Col1),去重后就能得到单一的目标值。 - 如果遇到多个相同最小值对应不同Col1的场景,可以调整窗口逻辑或改用
LISTAGG等函数聚合结果,你的示例场景里最小值唯一,这个方法完全适用。
内容的提问来源于stack exchange,提问作者M. Kemp
相关产品推荐
相关产品推荐

