[英]Oracle 12c Analytic Function
有沒有辦法使用 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
我的問題是:
是否可以使用分析 Function而不需要子查詢來導出值“A”? 我知道我可以使用分析 function “ROW_NUMBER”,在 ORDER BY 子句中對結果進行排序,全部在子查詢中,然后在外部查詢中添加一個 WHERE 子句,我說類似“WHERE RN = 1”,其中“ RN" 是子查詢中使用 ROW_NUMBER function 的列的別名。
使用聚合 function 和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
Output :
| COL1 | |:--- | | 一個 |
分析查詢:
如果你特別想要一個解析 function 那么:
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
Output :
COL1 | COL2:--- | ---: 一個 | 1
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.