Oracle 12c分析功能

M. *_*emp 3 sql oracle analytic-functions oracle12c

是否可以使用Oracle Analytic函数而不使用子查询在同一记录中的给定数据集中获取最小值Y的对应值X?

例如:

如果我具有以下数据集“ ds1”:

Col1  Col2
A     1
B     2
C     3
D     4
E     4
A     10
Run Code Online (Sandbox Code Playgroud)

通常,为了在Col1中找到对应于Col2中最小值“ 1”的值“ A”,我将编写以下查询:

select ds1.col1
     from ds1
          , (select min (col2) col2
                  from ds1) min_ds1
     where ds1.col2 = min_ds1.col2
/
Run Code Online (Sandbox Code Playgroud)

这是这种测试用例的执行代码:

### 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
Run Code Online (Sandbox Code Playgroud)

我的问题是:

是否可以使用解析函数并且不需要子查询来得出值“ A” ?我知道我可以使用解析函数“ ROW_NUMBER”,将结果排序在ORDER BY子句中,全部在子查询中,然后在外部查询中添加WHERE子句,在其中我说“ WHERE RN = 1”,其中“ RN”是子查询中使用ROW_NUMBER函数的列的别名。

MT0*_*MT0 5

使用聚合函数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;
Run Code Online (Sandbox Code Playgroud)

聚合查询

SELECT MIN( col1 ) KEEP ( DENSE_RANK FIRST ORDER BY col2 ) AS col1
FROM   ds1
Run Code Online (Sandbox Code Playgroud)

输出

| COL1 |
| :--- |
| A |

分析查询

如果您特别想要分析函数,则:

| COL1 |
| :--- |
| A    |

它有一个子查询,但是只有一个表扫描。

您可以轻松地将其集成到庞大的查询中:

SELECT col1, col2
FROM   (
  SELECT ds1.*,
         DENSE_RANK() OVER ( ORDER BY col2 ASC ) AS rnk
  FROM   ds1
)
WHERE  rnk = 1
Run Code Online (Sandbox Code Playgroud)

输出

COL1 | COL2
:--- | ---:
A | 1个

db <> 在这里拨弄