sql - Oracle 12c 分析函数
问题描述
有没有办法在给定的数据集中,在同一条记录中,使用 Oracle 分析函数,而不使用子查询来获取最小值 Y 的对应值 X?
例如:
如果我有以下数据集“ds1”:
Col1 Col2
A 1
B 2
C 3
D 4
E 4
A 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: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
来获取另一列的最小值:
甲骨文设置:
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 | | :--- | | 一个 |
分析查询:
如果你特别想要一个分析函数,那么:
SELECT col1, col2
FROM (
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
输出:
COL1 | COL2 :--- | ---: 一个 | 1
db<>在这里摆弄
推荐阅读
- reactjs - React useState如何修改数组中的第一个对象
- arrays - 如何在 Powershell 中按对象的一个属性值对对象数组进行排序?
- c# - 仅序列化类的集合
- python - 如何将文件或图像作为 Keras 模型中的参数提供给 model.predict?
- python - 我试图制作一个 Python 时钟,但我无法让它循环
- ruby-on-rails - 如何在创建操作中调用 Select_tag
- components - 上层实体期待“输入”引脚,而下层实体正在使用“输出”引脚
- python - 如何在 docsify.js 上使用深色主题、翻译和搜索?
- angular - Angular/angularfire2 - 读取可观察的文档并将数据保存到对象。没有异步管道
- php - 电子邮件在本地主机和服务器上发送,但邮件未到达服务器