ORACLE函式介紹第五篇 分析函式簡述

junsansi發表於2007-08-30

注:N表示數字型,C表示字元型,D表示日期型,[]表示內中引數可被忽略,fmt表示格式。

  分析函式計算基於group by的列,分組查詢出的行被稱為"比照(window)",在根據over()執行過程中,針對每一行都會重新定義比照。比照為"當前行(current row)"確定執行計算的行的範圍。這點一定要理解清楚。它是分析函式生成資料的原理。如果此處模糊,那麼你在應用分析函式時恐就不會那麼得心應手了。

  分析函式與前面章節中講到的聚合函式非常相似,不同於聚合函式的地方在於它們每個分組序列均返回多行。在本節示例中會同時應用兩種函式做對比,以更好體現二者的差異。通過本章節練習相信大家就會注意到,部分聚合函式和分析函式是同一個命令,事實確實如此。如果從語法格式上區分的話,沒加over()的即是聚合函式,加了over()即是分析函式:)

  有一點需要注意喲,除了order by子句的運算外,分析函式在SQL語句中將會最後執行。因此,分析函式只能應用於select的列或order by子句中(記住嘍,千萬別扔到什麼where、group by、having之類的地方了)。也正因此,同名的函式在做為聚合函式和分析函式時得出的結果可能不相同,就是因為此處運算邏輯不同造成的。

  同時,部分分析函式在選擇列時支援distinct,如果你指定了該引數,則over條件中就只能指定partition子句,而不能再指定order by 子句了。

  分析函式的語法結構比較複雜,但多數函式都具有相同的語法結構,所以先在之前進行統一介紹,後續單個函式介紹時就不過多說明函式語法結構了。

  基本上所有的分析函式均是這種格式:
  函式名稱 ([引數]) OVER (analytic_clause)
analytic_clause包含:[partition 子句][ order 子句 [window子句]]
Partition 子句:Partition by exp1[ ,exp2]...
Partition沒啥說的,功能強大引數少,主要用於分組,可以理解成select中的group by。不過它跟select語句後跟的group by 子句並不衝突。

Order子句:Order by exp1[asc|desc] [ ,exp2 [asc|desc]]... [nulls first|last]。部分函式支援window子句。
Order by的引數基本與select中的order by相同。大家按那個理解就是了。Nulls first|last是用來限定nulls在分組序列中的所在位置的,我們知道oracle中對於null的定義是未知,所以預設ordery的時候nulls總會被排在最前面。如果想控制值為null的列的話呢,nulls first|last引數就能派上用場了。

Window子句:En,貼個圖吧

   看起來複雜其實簡單,而且應用的機率相當的低,不詳細介紹了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-22282/,如需轉載,請註明出處,否則將追究法律責任。

相關文章