基本轉自 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函數返回一個唯一的值,除非遇到相同的數據時,此時所有相同數據的排名是一樣的,同時會在最後一條相同記錄和下一條不同記錄的排名之間空出排名。
2.5 lag,lead函數
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))
create
table
test(id number,
name
varchar2(20));
insert
into
test
values
(1,
'a'
);
insert
into
test
values
(1,
'b'
);
insert
into
test
values
(1,
'c'
);
insert
into
test
values
(2,
'd'
);
insert
into
test
values
(2,
'e'
);
1
|
select
wm_concat( name )
name
from
test; |
to_char(substr(mw.context_,1,1000))
- select regexp_substr('a,b,c,','[^,]+',1,rownum)
- from dual connect by rownum<=length(regexp_replace('a,b,c,', '[^,]', null))