基本轉自 tianlesoftware ,使用過新的便更新。
--聚合函數根據group的情況,返回每個groups里的一個result。 聚合函數可以使用orderby 和 having 的子句中使用。
分析函數的over()部分的分析字句有3部分構成,分區語句,排序語句和窗口語句。 (1)分區語句(partition by):將查詢結果分為不同的組,功能類似于group by語句,是分析函數工作的基礎。默認是將所有結果作為一個分組。 (2)排序語句(order by):將每個分區進行排序。 (3)窗口語句:定義當前窗口,具體說是對每一個分組,按照給定的排序規則排序后,從分組的頂部到底部依次迭代,每次針對當前的行可以定義一個包含若干行的窗口。如果省略了窗口語句,默認使用從分組第一行到當前行的分組。
1. Over()開窗函數
2. Nvl()函數3. Rollup,Cube自動匯總函數4. Rank,Dense_rank,Row_number函數5. Lag , Lead函數6. Sum,Avg, Count, Max函數7. Ratio_to_report報表處理函數8. First,Last,First_value,Last_value取基數的分析函數
9. Greatest,Least 函數
10. Trunc, Round,Decode, Substr函數
/* Formattedon 2009/11/08 20:36 (Formatter Plus v4.8.8) */ SELECT GROUPING_ID (student_name, subjects), student_name, subjects, SUM (score) FROM studentscore GROUP BY ROLLUP (student_name, subjects) ORDER BY 1; /* Formattedon 2009/11/08 20:36 (Formatter Plus v4.8.8) */ SELECT GROUPING (student_name), GROUPING (subjects), CASE WHEN GROUPING (student_name) = 0 AND GROUPING (subjects) = 1 THEN ' 學生成績合計 ' WHEN GROUPING (student_name) = 1 AND GROUPING (subjects) = 0 THEN ' 課目成績合計 ' WHEN GROUPING (student_name) = 1 AND GROUPING (subjects) = 1 THEN ' 總 計 ' ELSE '' END summary, student_name, subjects, SUM (score) FROM studentscore GROUP BY CUBE (student_name, subjects) ORDER BY 1, 2;(1) ROW_NUMBER:
Row_number函數返回一個唯一的值,當碰到相同數據時,排名按照記錄集中記錄的順序依次遞增。
(2)DENSE_RANK:
Dense_rank函數返回一個唯一的值,除非當碰到相同數據時,此時所有相同數據的排名都是一樣的。
(3) RANK:
Rank函數返回一個唯一的值,除非遇到相同的數據時,此時所有相同數據的排名是一樣的,同時會在最后一條相同記錄和下一條不同記錄的排名之間空出排名。
lag(exPRession,<offset>,<default>) 函數可以訪問組內當前行之前的行,
lead(expression,<offset>,<default>) 函數則正相反,可以反問組內當前行之后的行.其中,offset是正整數,默認為1.因組內第一個條記錄沒有之前的行,最后一行沒有之后的行,它表示要取列第N行之前或者之后的值,default就是用于處理這樣的信息,默認為空.它用于當之前或者之后第N行不存在時的值。
分析函數RATIO_TO_REPORT 用來計算當前記錄的指標expr占開窗函數over中包含記錄的所有同一指標的百分比. 這里如果開窗函數的統計結果為null或者為0,就是說占用比率的被除數為0或者為null, 則得到的結果也為0.
行轉列函數 pivot
c4 as (select * from b4 pivot (sum(money) tm for (ap) in (('a') a,('b') b,('c') c,('d') d,('e') e)))
select * from t pivot (sum(a) aa,sum(b) bb for ( c,d) in (('啊',3) ss,('a',5) sss))
新聞熱點
疑難解答