有没有办法使用 Oracle Analytic 函数而不使用子查询来获取给定数据集中、同一记录中最小值 Y 的对应值 X?例如:如果我有以下数据集“ds1”:Col1 Col2A 1B 2C 3D 4E 4A 10通常,为了找到 Col1 中的值“A”,它对应于 Col2 中的最小值“1”,我会编写以下查询:select ds1.col1 from ds1 , (select min (col2) col2 from ds1) min_ds1 where ds1.col2 = min_ds1.col2/这是此类测试用例的执行代码:### 1014.010, Start time is: 10/30/2019 11:39:35amMYUN@MYDB-C1>>create table ds1 (col1 varchar2 (1), col2 number) 2 /Table created.Elapsed: 00:00:00.01MYUN@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.02MYUN@MYDB-C1>>commit 2 /Commit complete.Elapsed: 00:00:00.01MYUN@MYDB-C1>>col col1 format a10MYUN@MYDB-C1>>select ds1.col1 2 from ds1 3 , (select min (col2) col2 4 from ds1) min_ds1 5 where ds1.col2 = min_ds1.col2 6 /COL1----------A1 row selected.Elapsed: 00:00:00.01MYUN@MYDB-C1>>drop table ds1 2 /Table dropped.Elapsed: 00:00:00.03The time now: 10/30/2019 11:39:36am我的问题是:是否可以在不需要子查询的情况下使用分析函数 和 推导出值“A”?我知道我可以使用分析函数“ROW_NUMBER”,在 ORDER BY 子句中对结果进行排序,所有这些都在一个子查询中,然后在外部查询上添加一个 WHERE 子句,在那里我说“WHERE RN = 1”,其中“RN"是使用 ROW_NUMBER 函数的子查询中列的别名。 最佳答案 使用带有 KEEP 的聚合函数来获取另一列的最小值: Oracle 设置 : create table ds1 ( col1, col2 ) AS select 'A', 1 from dual union all select 'B', 2 from dual union all select 'C', 3 from dual union all select 'D', 4 from dual union all select 'E', 4 from dual union all select 'F', 10 from dual; 聚合查询 : SELECT MIN( col1 ) KEEP ( DENSE_RANK FIRST ORDER BY col2 ) AS col1FROM ds1 输出 : 分析查询 :如果你特别想要一个解析函数,那么: SELECT col1, col2FROM ( SELECT ds1.*, DENSE_RANK() OVER ( ORDER BY col2 ASC ) AS rnk FROM ds1)WHERE rnk = 1这有一个子查询,但只有一个表扫描。您可以轻松地将其集成到一个巨大的查询中: WITH my_huge_query AS ( <paste your huge query here>)SELECT *FROM ( SELECT m.*, DENSE_RANK() OVER( ORDER BY col2 ASC ) AS rnk FROM my_huge_query m)WHERE rnk = 1 输出 : db fiddle here关于sql - Oracle 12c 分析函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58629122/