Oracle 12c分析函数



有没有一种方法可以在不使用子查询的情况下,使用Oracle分析函数,在同一记录中获得给定数据集中最小值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|

分析查询

如果你特别想要一个分析函数,那么:

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:---|---:A|1

db<>小提琴这里

相关内容

  • 没有找到相关文章

最新更新