程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> [Oracle]分析函數(1)-語法

[Oracle]分析函數(1)-語法

編輯:Oracle教程

語法概述

\

\

Analytic-Function

\

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

為什麼課程分析函數會讓人覺的非常復雜呢,我們來看看,這個窗口范圍有兩種取數方式,一個是根據物理位置,就是row關鍵字,一個是根據邏輯位置取數,就是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

分析函數 VS 聚合函數

\

從上面的例子我們可以知道,分析函數和聚合函數的主要差異有:

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved