是否可以使用Oracle Analytic函数而不使用子查询在同一记录中的给定数据集中获取最小值Y的对应值X?
例如:
如果我具有以下数据集“ ds1”:
Col1 Col2 A 1 B 2 C 3 D 4 E 4 A 10
通常,为了在Col1中找到对应于Col2中最小值“ 1”的值“ A”,我将编写以下查询:
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: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 ds1.col1 2 from ds1 3 , (select min (col2) col2 4 from ds1) min_ds1 5 where ds1.col2 = min_ds1.col2 6 / 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
我的问题是:
是否可以使用解析函数并且不需要子查询来得出值“ 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 col1
FROM ds1
输出:
| COL1 | | :--- | | A |
分析查询:
如果您特别想要分析函数,则:
| COL1 | | :--- | | A |
它有一个子查询,但是只有一个表扫描。
您可以轻松地将其集成到庞大的查询中:
SELECT col1, col2
FROM (
SELECT ds1.*,
DENSE_RANK() OVER ( ORDER BY col2 ASC ) AS rnk
FROM ds1
)
WHERE rnk = 1
输出:
COL1 | COL2 :--- | ---: A | 1个
db <> 在这里拨弄