Oracle 分析功能(1) 語法

2021-09-22 09:48:37 字數 3399 閱讀 7492

analytic_clause之partition子句

analytic_clause之order by子句

analytic_clause之windowing子句

舉例:

以下看乙個樣例簡單過下語法:

例:sum(sal) over (partition by deptno order by ename) new_alias

sum就是函式名

(sal)是分析函式的引數,每乙個函式有0~3個引數,引數能夠是表示式,比如:sum(sal+comm)

over() 是開窗函式。這是開啟分析函式的起點,對於既可作為聚集函式又可作為分析函式的函式,oracle無法識別,必須用over來標識此函式為分析函式,此處不可省。

partition by deptno 是可選的分割槽子句,假設不存在不論什麼分割槽子句,則所有的結果集可看作乙個單一的大區

order by則是窗體規則;

row |range between...and 是窗體範圍(row就像通過自身位置的前後物理座位來找相應的位置。相對固定。而range是通過某種條件來找位置,須要計算方能確定相應位置,如長我3歲和小我兩歲的人。)

關於窗體範圍的取數方式有多種,看似很複雜,事實上不難,我們開始慢慢剖析:

關鍵位置就3個:1. 分組第一行unbounded preceding  2. 當前行current row  3.分組最後一行 unbounded following

接下來,產生了最簡單的三個取數範圍: 

分組第一行->當前行 rows [between] unbounded preceding [and current row]。

分組第一行->分組最後一行   rows between unbounded preceding and unbounded following。 

當前行->分組最後一行 rows between current row and unbounded following

為什麼課程分析函式會讓人覺的很複雜呢。我們來看看,這個窗體範圍有兩種取數方式,乙個是依據物理位置。就是rowkeyword。乙個是依據邏輯位置取數,就是range,這時剛才的取數範圍從3個變成6個了,例如以下:

rows的  分組第一行->當前行。分組第一行->分組最後一行。 當前行->分組最後一行

range的 分組第一行->當前行,分組第一行->分組最後一行, 當前行->分組最後一行

只是這種場景都考慮周全了嗎,還有沒有漏考慮的,有啊。我們繼續看看有哪些可能:

從分組第一行->當前行前n行             rows between unbounded preceding and n行 preceding

從分組第一行->當前行後n行             rows between unbounded preceding and n行 following                                   

從當前行->當前行後n行                 rows between current row and n行 following

從當前行前n行->當前行                 rows between n行 preceding and current row

從當前行前n行->分組最後一行           rows between n行 preceding and unbounded following

從當前行後n行->分組最後一行           rows between n行 following and unbounded following

從當前行前n1行->到當前行前n2行        rows between n1行 preceding and n2行 preceding

從當前行後n1行->到當前行後n2行        rows between n1行 following and n2行 following

還有沒有。有!

從當前行前n1行到當前行後n2行          rows between n1行 preceding and n2行 following

還有沒有比方從分組第一行後n行到當前行,從當前行到分組最後一行前n行啥的啊? 

哦。那倒是沒有了,對了,你腦子還不夠迷糊啊,記這麼多???

總算結束了,只是另乙個窗體開始於當前行,結束於當前行的。只是這無意義,要了幹啥呢?所以,算算,至少有9個。

考慮到rows 和range兩套人馬。這下又多了18個了。加上前面的6個,就是24個了。

只是後面多出來的這18個,用到的機率比前面6個要少不少。

對了。另一件非常重要的事要交代

不寫between and  ,在有order by 的情況下,就是分組第一行到當前行                        between unbounded preceding  and current row

不寫between and  ,在沒有order by 的情況下。就是分組第一行到分組最後一行;     between unbounded preceding and unbounded following 

從上面的樣例我們能夠知道,分析函式和聚合函式的主要差異有:

1. 分析函式每組有多少行就返回多少行(好比多乙個偽列)。而聚合函式是每組無論有多少行都被聚合成一行。

2. 分析函式的order by 和聚合函式order by 排序的概念不一樣,分析函式的order by 標記從分組第一行到當前行的範圍圈定,然後根據這個範圍,根據這個順序開始聚合累加。集合函式oracle by它不影響資料,只影響排序。

Oracle 分析功能(1) 語法

analytic clause之partition子句 analytic clause之order by子句 analytic clause之windowing子句 舉例 以下看乙個樣例簡單過下語法 例 sum sal over partition by deptno order by ename ...

Oracle 分析函式(1) 語法

analytic clause之partition子句 analytic clause之order by子句 analytic clause之windowing子句 舉例 下面看乙個例子簡單過下語法 例 sum sal over partition by deptno order by ename ...

Oracle基本語法1

oracle 語法 1 啟動oracle服務 window下啟動oracle服務 net start 資料庫服務名稱 net start 資料庫 2 建立使用者 create user 建立使用者的名稱 identified by 建立使用者的密碼 3 修改使用者口令 alter user 需要修改...