注:Oracle 的 LiveSQL 站點已經(jīng)升級到 19c 版本,可以通過該網(wǎng)站來測試 19c 的新特性。 在Oracle 19c中,一個新的函數(shù) ANY_VALUE 被引入進(jìn)來,這個函數(shù)的作用是基于ORDER BY定義返回每個組中的任何值,通過這一個函數(shù),可以消除將每個列都指定為GROUP BY子句的一部分的必要性。 看一個示例。 select d.deptno,d.dname,sum(e.sal) from scott.dept d,scott.emp e where e.deptno = d.deptno group by d.deptno,d.dname
Result Set 13DEPTNO | DNAME | SUM(E.SAL) |
---|
10 | ACCOUNTING | 8750 | 20 | RESEARCH | 10875 | 30 | SALES | 9400 |
在有了 ANY_VALUE 之后,Group By之后就不再需要增加冗余的字段,SQL 再次變得優(yōu)雅: select d.deptno,any_value(d.dname) as DEPTNAME,sum(e.sal) from scott.dept d,scott.emp e where e.deptno = d.deptno group by d.deptno
ANY_VALUE 也可以作為類似 MAX/MIN 的窗口函數(shù)發(fā)揮作用。
Listagg 是 Oracle 11.2 中新增的函數(shù),對于指定的度量,LISTAGG對ORDER BY子句中指定的每個組內(nèi)的數(shù)據(jù)進(jìn)行排序,然后連接度量列的值。
作為單集聚合函數(shù),LISTAGG對所有行進(jìn)行操作并返回單個輸出行。
作為一個組集聚合,該函數(shù)對GROUP BY子句定義的每個組進(jìn)行操作并返回一個輸出行。
作為分析函數(shù),LISTAGG根據(jù)query_partition_clause中的一個或多個表達(dá)式將查詢結(jié)果集劃分為組。
由于具有靈活的數(shù)據(jù)操作性,LISTAGG函數(shù)是行列轉(zhuǎn)換的首選。以下是一個簡單的示例: SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP(ORDER BY ename) AS employees FROM scott.emp GROUP BY deptno;
DEPTNO | EMPLOYEES |
---|
10 | CLARK,KING,MILLER | 20 | ADAMS,FORD,JONES,SCOTT,SMITH | 30 | ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD |
大家可以在 livesql.oracle.com 網(wǎng)站體驗 19c 的新特性: 在19c之前,Listagg 函數(shù)不能對轉(zhuǎn)換的結(jié)果去重,如果你希望計算結(jié)果不包含重復(fù)值,則還需要進(jìn)行一次嵌套處理。如下是常見的帶有重復(fù)值計算輸出: select d.dname, listagg (e.job,', ') within group (order by e.job) jobs from scott.dept d, scott.emp e where d.deptno = e.deptno group by d.dname
DNAME | JOBS |
---|
ACCOUNTING | CLERK, MANAGER, PRESIDENT | RESEARCH | ANALYST, ANALYST, CLERK, CLERK, MANAGER | SALES | CLERK, MANAGER, SALESMAN, SALESMAN, SALESMAN, SALESMAN |
在Oracle 19c中,這個函數(shù)向前邁進(jìn)了一小步,支持 Distinct 關(guān)鍵字,可以通過加入這個關(guān)鍵字直接去除重復(fù)值,SQL 又向優(yōu)雅邁進(jìn)了一小步: select d.dname, listagg (DISTINCT e.job,', ') within group (order by e.job) jobs from scott.dept d, scott.emp e where d.deptno = e.deptno group by d.dname
DNAME | JOBS |
---|
ACCOUNTING | CLERK, MANAGER, PRESIDENT | RESEARCH | ANALYST, CLERK, MANAGER | SALES | CLERK, MANAGER, SALESMAN |
在19c 中,Oracle 還對位運算進(jìn)行了增強(qiáng),增加了一系列的位運算函數(shù),通過位運算,避免一些排序操作,可以實現(xiàn)對于性能的巨大提升。 例如,如下案例,通過物化視圖的自動改寫,可以實現(xiàn)顯著的性能提升。 希望提前體驗19c 的同學(xué)們可以去 livesql.oracle.com 進(jìn)行測試,19c 馬上到來,抓緊時間學(xué)習(xí)吧!
關(guān)注公眾號:數(shù)據(jù)和云(OraNews)回復(fù)關(guān)鍵字獲取 2018DTCC , 數(shù)據(jù)庫大會PPT 2018DTC,2018 DTC 大會 PPT
DBALIFE ,“DBA 的一天”海報
DBA04 ,DBA 手記4 電子書 122ARCH ,Oracle 12.2體系結(jié)構(gòu)圖
2018OOW ,Oracle OpenWorld 資料
|