當前位置:首頁 » 編程語言 » sql窗口函數oracle
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql窗口函數oracle

發布時間: 2022-12-23 01:15:06

① oracle窗口函數都有哪些

通過舉例,快速理解窗口函數。

2.1 舉例

1)創建表 user,表 user 的數據如下

  • mysql>select*fromuser;+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+|id|name|address|createtime|+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+|1|aa|cun|2020‐06‐0100:00:00||2|bb|cun|2020‐06‐0100:00:00||3|bb|shi|2020‐06‐0101:00:00||4|bb|shi|2020‐06‐0101:00:00||5|cc|cun|2020‐06‐0101:00:00||6|tt|cun|2020‐06‐0301:00:00||7|eee|cun|2020‐06‐0401:00:00||8|eee|cun|2020‐06‐0401:00:00||9|xx|shen|2020‐06‐0201:00:00|+‐‐‐‐+‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+9rowsinset(0.00sec)


  • 2)窗口函數的使用

  • SELECTcreatetime,row_number()over(orderbycreatetime)AScrFROM user ;+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐+|createtime|ll|+‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐+|2020‐06‐0100:00:00|1||2020‐06‐0100:00:00|2||2020‐06‐0101:00:00|3||2020‐06‐0101:00:00|4||2020‐06‐0101:00:00|5||2020‐06‐0201:00:00|6||2020‐06‐0301:00:00|7||2020‐06‐0401:00:00|8|| 2020‐06‐04 01:00:00 | 9 | +‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐+‐‐‐‐+9rowsinset(0.00sec)


  • row_number() over(order by createtime) as cr 這部分為窗口函數。over(order by createtime)為窗口規范,函數 row_number() 即對窗口的數據進行編號。所以上述 sql 的意思為:先對 createtime 進行排序,然後對每行數據進行編號。

② Oracle 怎麼查詢函數在哪個包里比如TRUNC這個函數

查看包中函數、過程的SQL語句:
SELECT owner,name,text,line FROM DBA_SOURCE where type = 'PACKAGE' and (TEXT like ' procere%' or TEXT like ' function%');
結果中,owenr:哪個用戶的,name:哪個包,text:函數名及部分參數,line:行位置
如果要看到全部參數,看line,然後+1、+2...就可以看到
查看函數、過程的SQL語句:
SELECT OWNER,NAME,TYPE,TEXT,line FROM DBA_SOURCE WHERE LINE=1 AND TYPE IN ('FUNCTION','PROCEDURE');
如果要看完整的參數定義,按owner,name,type,text定位,一般前幾行就是參數定義。
以上語句測試過,應該能滿足你的要求。
別忘了給「最佳答案」就行(呵呵)

③ 求sql server 2008中類似oracle中to_char轉換日期格式函數,想得出月日的函數

1、首先打開SQL SERVER的管理工具,然後選定一個資料庫,點擊新建查詢。

④ oracle怎麼導出function和procere,即函數和存儲過程

使用oracle的一般都裝了PL/SQL吧,對象窗口,找到對應的函數或者存儲過程,右鍵查看或編輯。

一般單個我是這么用,如果很多的話可以參考一下網上提供的方法:

oracle 導出一個用戶下的所有存儲過程
方法一:
set echo off ;
set heading off ;
set feedback off ;
spool d:\tmp.txt
select text from user_source ;
spool off;
方法二:
使用PL/SQL 菜單 Tools --> Export user objects... ,對彈出的dialog中選擇user和output file,選中要導出的內容,點擊export導出就行了

⑤ 怎麼測試,oracle function函數

可在第三方軟體中,如pl/sql中編譯。1、打開pl/sql軟體並登錄到指定資料庫。2、點擊左上方像紙片的按鈕,然後點擊「sql窗口」3、在彈出窗口中編寫自定義函數。4、編寫完畢後,直接點擊左上角像齒輪的按鈕(即執行按鈕),就可以編譯了。

⑥ sql函數無法向客服端返回數據

首頁 問答 PL/SQL異常處理 - 函數無返回值返回
Q
PL/SQL異常處理 - 函數無返回值返回
oracle plsql exception-handling
2016-08-20 60 views 2 likes
2
在Oracle 12.1中,我有一個相當簡單的PL/SQL常式。輸出是單個值,可以是逗號分隔的名稱列表或字元串「NO_DATA」。沒有其他輸出允許。對於輸入,有一個單一的值,一個公司名稱。如果我硬編碼公司名稱,並從SQL窗口運行SQL語句(不是函數),它運行良好,所以我知道SQL是有效的。這個問題與異常處理有關。如果我沒有任何異常處理,並傳遞一個有效的名稱給函數,它會給我一個有效的輸出。當我找不到數據時,我需要能夠處理這種情況,所以我添加了簡單的異常處理。這是我得到我的問題的地方。有了異常處理代碼,如果我傳入了一個不合適的值(又名公司名稱,未找到),我就會像'我應該'那樣得到'NO_DATA'。如果我傳遞了一個很好的值,那麼我得到一個PL/SQL錯誤ORA-06503:PL/SQL:函數返回時沒有值。這是我的代碼。PL/SQL異常處理 - 函數無返回值返回

⑦ 簡述什麼是oracle的窗口函數

窗口函數可以計算一定 記錄范圍內、一定值域內、或者一段時間內的累計和以及移動平均值等等.之所以使用窗口這個術語,是因為對結果的處理使用了一個滑動的查詢結果集范圍。

⑧ mysql 與oracle中的存儲過程及函數有什麼區別,盡可能詳細哦

本質上沒區別。只是函數有如:只能返回一個變數的限制。而存儲過程可以返回多個。而函數是可以嵌入在sql中使用的,可以在select中調用,而存儲過程不行。執行的本質都一樣。
函數限制比較多,比如不能用臨時表,只能用表變數.還有一些函數都不可用等等.而存儲過程的限制相對就比較少
由於我現在基本上是DBA的工作,因此平時也看一些資料庫方面的書籍。但是我一直對存儲過程和函數之間的區別掌握不透。我向來認為存儲過程可以實現的操作,函數也一樣可以實現。最近,剛好大學的老師給我們上SQL-Server的課程,我對這個問題的疑惑終於慢慢解開。今天晚上順便看了些網上的資料,覺得以下分析比較合理:
1. 一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。
2. 對於存儲過程來說可以返回參數,而函數只能返回值或者表對象。
3. 存儲過程一般是作為一個獨立的部分來執行,而函數可以作為查詢語句的一個部分來調用,由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。
4. 當存儲過程和函數被執行的時候,SQL Manager會到procere cache中去取相應的查詢語句,如果在procere cache里沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯。
Procere cache中保存的是執行計劃 (execution plan) ,當編譯好之後就執行procere cache中的execution plan,之後SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中保存這個plan,評判的標准一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。保存在cache中的plan在下次執行時就不用再編譯了。
存儲過程和用戶自定義函數具體的區別
存儲過程
存儲過程可以使得對資料庫的管理、以及顯示關於資料庫及其用戶信息的工作容易得多。存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲並作為一個單元處理。存儲過程存儲在資料庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變數、有條件執行以及其它強大的編程功能。
存儲過程可包含程序流、邏輯以及對資料庫的查詢。它們可以接受參數、輸出參數、返回單個或多個結果集以及返回值。
可以出於任何使用 SQL 語句的目的來使用存儲過程,它具有以下優點:
可以在單個存儲過程中執行一系列 SQL 語句。
可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。
存儲過程在創建時即在伺服器上進行編譯,所以執行起來比單個 SQL 語句快。
用戶定義函數
函數是由一個或多個 Transact-SQL 語句組成的子程序,可用於封裝代碼以便重新使用。Microsoft? SQL Server? 2000 並不將用戶限制在定義為 Transact-SQL 語言一部分的內置函數上,而是允許用戶創建自己的用戶定義函數。
可使用 CREATE FUNCTION 語句創建、使用 ALTER FUNCTION 語句修改、以及使用 DROP FUNCTION 語句除去用戶定義函數。每個完全合法的用戶定義函數名 (database_name.owner_name.function_name) 必須唯一。
必須被授予 CREATE FUNCTION 許可權才能創建、修改或除去用戶定義函數。不是所有者的用戶在 Transact-SQL 語句中使用某個函數之前,必須先給此用戶授予該函數的適當許可權。若要創建或更改在 CHECK 約束、DEFAULT 子句或計算列定義中引用用戶定義函數的表,還必須具有函數的 REFERENCES 許可權。
函數中的有效語句類型包括:
DECLARE 語句,該語句可用於定義函數局部的數據變數和游標。
為函數局部對象賦值,如使用 SET 給標量和表局部變數賦值。
游標操作,該操作引用在函數中聲明、打開、關閉和釋放的局部游標。不允許使用 FETCH 語句將數據返回到客戶端。僅允許使用 FETCH 語句通過 INTO 子句給局部變數賦值。
控制流語句。
SELECT 語句,該語句包含帶有表達式的選擇列表,其中的表達式將值賦予函數的局部變數。
INSERT、UPDATE 和 DELETE 語句,這些語句修改函數的局部 table 變數。
EXECUTE 語句,該語句調用擴展存儲過程。
在查詢中指定的函數的實際執行次數在優化器生成的執行計劃間可能不同。示例為 WHERE 子句中的子查詢喚醒調用的函數。子查詢及其函數執行的次數會因優化器選擇的訪問路徑而異

⑨ 能說一下oracle中的開窗函數 聚合函數 分析函數都是什麼嗎

我也是用oracle資料庫的,在實際開發中用到開窗函數和分析函數的機會還是很少的,用聚合函數的時候非常多,請LZ多關注聚合函數,下面是我上各大網站收集的,希望對樓主有所幫助。

分析函數用於計算基於組的某種聚合值,它和聚合函數的不同之處是
對於每個組返回多行,而聚合函數對於每個組只返回一行。
下面通過幾個例子來說明其應用。
1:統計某商店的營業額。
date sale
1 20
2 15
3 14
4 18
5 30
規則:按天統計:每天都統計前面幾天的總額
得到的結果:
DATE SALE SUM
----- -------- ------
1 20 20 --1天
2 15 35 --1天+2天
3 14 49 --1天+2天+3天
4 18 67 .
5 30 97 .

2:統計各班成績第一名的同學信息
NAME CLASS S
----- ----- ----------------------
fda 1 80
ffd 1 78
dss 1 95
cfe 2 74
gds 2 92
gf 3 99
ddd 3 99
adf 3 45
asdf 3 55
3dd 3 78

通過:
--
select * from
(
select name,class,s,rank()over(partition by class order by s desc) mm from t2
)
where mm=1
--
得到結果:
NAME CLASS S MM
----- ----- ---------------------- ----------------------
dss 1 95 1
gds 2 92 1
gf 3 99 1
ddd 3 99 1

注意:
1.在求第一名成績的時候,不能用row_number(),因為如果同班有兩個並列第一,row_number()只返回一個結果
2.rank()和dense_rank()的區別是:
--rank()是跳躍排序,有兩個第二名時接下來就是第四名
--dense_rank()l是連續排序,有兩個第二名時仍然跟著第三名

3.分類統計 (並顯示信息)
A B C
-- -- ----------------------
m a 2
n a 3
m a 2
n b 2
n b 1
x b 3
x b 2
x b 4
h b 3
select a,c,sum(c)over(partition by a) from t2
得到結果:
A B C SUM(C)OVER(PARTITIONBYA)
-- -- ------- ------------------------
h b 3 3
m a 2 4
m a 2 4
n a 3 6
n b 2 6
n b 1 6
x b 3 9
x b 2 9
x b 4 9

如果用sum,group by 則只能得到
A SUM(C)
-- ----------------------
h 3
m 4
n 6
x 9
無法得到B列值

=====
select * from test

數據:
A B C
1 1 1
1 2 2
1 3 3
2 2 5
3 4 6

---將B欄位值相同的對應的C 欄位值加總
select a,b,c, SUM(C) OVER (PARTITION BY B) C_Sum
from test

A B C C_SUM
1 1 1 1
1 2 2 7
2 2 5 7
1 3 3 3
3 4 6 6

---如果不需要已某個欄位的值分割,那就要用 null

eg: 就是將C的欄位值summary 放在每行後面

select a,b,c, SUM(C) OVER (PARTITION BY null) C_Sum
from test

A B C C_SUM
1 1 1 17
1 2 2 17
1 3 3 17
2 2 5 17
3 4 6 17

求個人工資占部門工資的百分比
SQL> select * from salary;

NAME DEPT SAL
---------- ---- -----
a 10 2000
b 10 3000
c 10 5000
d 20 4000

SQL> select name,dept,sal,sal*100/sum(sal) over(partition by dept) percent from salary;

NAME DEPT SAL PERCENT
---------- ---- ----- ----------
a 10 2000 20
b 10 3000 30
c 10 5000 50
d 20 4000 100
二:開窗函數
開窗函數指定了分析函數工作的數據窗口大小,這個數據窗口大小可能會隨著行的變化而變化,舉例如下:
1:
over(order by salary) 按照salary排序進行累計,order by是個默認的開窗函數
over(partition by deptno)按照部門分區
2:
over(order by salary range between 5 preceding and 5 following)
每行對應的數據窗口是之前行幅度值不超過5,之後行幅度值不超過5
例如:對於以下列
aa
1
2
2
2
3
4
5
6
7
9

sum(aa)over(order by aa range between 2 preceding and 2 following)
得出的結果是
AA SUM
---------------------- -------------------------------------------------------
1 10
2 14
2 14
2 14
3 18
4 18
5 22
6 18
7 22
9 9

就是說,對於aa=5的一行,sum為 5-1<=aa<=5+2 的和
對於aa=2來說,sum=1+2+2+2+3+4=14 ;
又如 對於aa=9 ,9-1<=aa<=9+2 只有9一個數,所以sum=9 ;

3:其它:
over(order by salary rows between 2 preceding and 4 following)
每行對應的數據窗口是之前2行,之後4行
4:下面三條語句等效:
over(order by salary rows between unbounded preceding and unbounded following)
每行對應的數據窗口是從第一行到最後一行,等效:
over(order by salary range between unbounded preceding and unbounded following)
等效
over(partition by null)

other(
數用於計算基於組的某種聚合值,它和聚合函數的不同之處是對於每個組返回多行,而聚合函數對於每個組只返回一行。
一、 over函數
over函數指定了分析函數工作的數據窗口的大小,這個數據窗口大小可能會隨著行的變化而變化,例如:
over(order by salary)按照salary排序進行累計,order by是個默認的開窗函數
over(partition by deptno) 按照部門分區
over(order by salary range between 50 preceding and 150 following)每行對應的數據窗口是之前行幅度值不超過50,之後行幅度值不超過150的數據記錄
over(order by salary rows between 50 perceding and 150 following)前50行,後150行
over(order by salary rows between unbounded preceding and unbounded following)所有行
over(order by salary range between unbounded preceding and unbounded following)所有行
二、 sum函數
功能描述:該函數計算組中表達式的累積和。
SAMPLE:下例計算同一經理下員工的薪水累積值
SELECT manager_id, last_name, salary,
SUM (salary) OVER (PARTITION BY manager_id ORDER BY salary
RANGE UNBOUNDED PRECEDING) l_csum
FROM employees
WHERE manager_id in (101,103,108);
三、 應用實例
1, 測試環境設置
設有銷售表t_sales (subcompany,branch,region,customer,sale_qty); 存儲客戶的銷售明細,記錄如下所示。
Subcompany Branch Region Customer Sale_qty
北京分公司 北京經營部 片區1 客戶1 1
北京分公司 北京經營部 片區1 客戶1 1
北京分公司 北京經營部 片區1 客戶2 1
北京分公司 北京經營部 片區1 客戶2 1
北京分公司 北京經營部 片區2 客戶1 1
北京分公司 北京經營部 片區2 客戶1 1
北京分公司 北京經營部 片區2 客戶2 1
北京分公司 北京經營部 片區2 客戶2 1
北京分公司 其他經營部 片區1 客戶1 1
北京分公司 其他經營部 片區1 客戶1 1
北京分公司 其他經營部 片區1 客戶2 1
北京分公司 其他經營部 片區1 客戶2 1
北京分公司 其他經營部 片區2 客戶1 1
北京分公司 其他經營部 片區2 客戶1 1
北京分公司 其他經營部 片區2 客戶2 1
北京分公司 其他經營部 片區2 客戶2 1
create table t_sales(
subcompany varchar2(40),
branch varchar2(40),
region varchar2(40),
customer varchar2(40),
sale_qty numeric(18,4)
);

comment on table t_sales is '銷售表,分析函數測試';
comment on column t_sales.subcompany is '分公司';
comment on column t_sales.branch is '經營部';
comment on column t_sales.region is '片區';
comment on column t_sales.customer is '客戶';
comment on column t_sales.sale_qty is '銷售數量';

2,問題提出
現在要求給出銷售匯總報表,報表中需要提供的數據包括客戶匯總,和客戶在其上級機構中的銷售比例。
Subcompany Branch Region Customer Sale_qty Rate
北京分公司 北京經營部 片區1 客戶1 2 50%
北京分公司 北京經營部 片區1 客戶2 2 50%
北京分公司 北京經營部 片區1 小計 4 50%
北京分公司 北京經營部 片區2 客戶1 2 50%
北京分公司 北京經營部 片區2 客戶2 2 50%
北京分公司 北京經營部 片區2 小計 4 50%
北京分公司 北京經營部 小計 小計 8 50%
北京分公司 北京經營部 片區1 客戶1 2 50%
北京分公司 北京經營部 片區1 客戶2 2 50%
北京分公司 北京經營部 片區1 小計 4 50%
北京分公司 北京經營部 片區2 客戶1 2 50%
北京分公司 北京經營部 片區2 客戶2 2 50%
北京分公司 北京經營部 片區2 小計 4 50%
北京分公司 北京經營部 小計 小計 8 50%
北京分公司 小計 小計 小計 16 100%
3,解決方案(方案1)
首先我們可以使用oracle對group by 的擴展功能rollup得到如下的聚合匯總結果。
select
subcompany,
branch,
region,
customer,
sum(sale_qty) sale_qty
from t_sales
group by rollup(subcompany,branch,region,customer);
Subcompany Branch Region Customer Sale_qty
北京分公司 北京經營部 片區1 客戶1 2
北京分公司 北京經營部 片區1 客戶2 2
北京分公司 北京經營部 片區1 4
北京分公司 北京經營部 片區2 客戶1 2
北京分公司 北京經營部 片區2 客戶2 2
北京分公司 北京經營部 片區2 4
北京分公司 北京經營部 8
北京分公司 其他經營部 片區1 客戶1 2
北京分公司 其他經營部 片區1 客戶2 2
北京分公司 其他經營部 片區1 4
北京分公司 其他經營部 片區2 客戶1 2
北京分公司 其他經營部 片區2 客戶2 2
北京分公司 其他經營部 片區2 4
北京分公司 其他經營部 8
北京分公司 16
16
分析上面的臨時結果,我們看到:
明細到客戶的匯總信息,其除數為當前的sum(sale_qty),被除數應該是到片區的小計信息。
明細到片區的匯總信息,其除數為片區的sum(sale_qty),被除數為聚合到經營部的匯總數據。
。。。
考慮到上述因素,我們可以使用oracle的開窗函數over,將數據定位到我們需要定位的記錄。如下代碼中,我們利用開窗函數over直接將數據定位到其上次的小計位置。
over(partition by decode(f_branch, 1, null, subcompany), decode(f_branch, 1, null, decode(f_region, 1, null, branch)), decode(f_branch, 1, null, decode(f_region, 1, null, decode(f_customer, 1, null, region))), null)
經整理後的查詢語句如下。
select subcompany,
decode(f_branch, 1,subcompany||'(С¼Æ)', branch),
decode(f_region,1,branch||'(С¼Æ)',region),
decode(f_customer,1,region||'(С¼Æ)', customer),
sale_qty,
trim(to_char(round(sale_qty/
sum(sale_qty) over(partition by decode(f_branch, 1, null, subcompany), decode(f_branch, 1, null, decode(f_region, 1, null, branch)), decode(f_branch, 1, null, decode(f_region, 1, null, decode(f_customer, 1, null, region))), null),2) *100,99990.99))
from (select grouping(branch) f_branch,
grouping(region) f_region,
grouping(customer) f_customer,
subcompany,
branch,
region,
customer,
sum(sale_qty) sale_qty
from t_sales
group by subcompany, rollup(branch, region, customer))
Subcompany Branch Region Customer Sale_qty Rate
北京分公司 北京經營部 片區1 客戶1 2 50.00
北京分公司 北京經營部 片區1 客戶2 2 50.00
北京分公司 北京經營部 片區2 客戶1 2 50.00
北京分公司 北京經營部 片區2 客戶2 2 50.00
北京分公司 北京經營部 片區1 片區1(小計) 4 50.00
北京分公司 北京經營部 片區2 片區2(小計) 4 50.00
北京分公司 其他經營部 片區1 客戶1 2 50.00
北京分公司 其他經營部 片區1 客戶2 2 50.00
北京分公司 其他經營部 片區2 客戶1 2 50.00
北京分公司 其他經營部 片區2 客戶2 2 50.00
北京分公司 其他經營部 片區1 片區1(小計) 4 50.00
北京分公司 其他經營部 片區2 片區2(小計) 4 50.00
北京分公司 北京經營部 北京經營部(小計) (小計) 8 50.00
北京分公司 其他經營部 其他經營部(小計) (小計) 8 50.00
北京分公司 北京分公司(小計) (小計) (小計) 16 100.00
北京分公司 北京經營部 片區1 客戶1 2 50.00
4,可能的另外一種解決方式(方案2)
select subcompany,
decode(f_branch, 1,subcompany||'(С¼Æ)', branch),
decode(f_region,1,branch||'(С¼Æ)',region),
decode(f_customer,1,region||'(С¼Æ)', customer),
sale_qty,
/* trim(to_char(round(sale_qty/*/
decode(f_branch+f_region+f_customer,
0,
(sum(sale_qty) over(partition by subcompany,branch,region))/2,
1,
(sum(sale_qty) over(partition by subcompany,branch))/3,
2,
(sum(sale_qty) over(partition by subcompany))/4 ,
sum(sale_qty) over()/4
)/*
,2) *100,99990.99))*/
from (select grouping(branch) f_branch,
grouping(region) f_region,
grouping(customer) f_customer,
subcompany,
branch,
region,
customer,
sum(sale_qty) sale_qty
from t_sales
group by subcompany, rollup(branch, region, customer))
在上面的解決方式中,最大的問題在於開窗函數過大。導致每次計算涉及到的行數過多,影響到執行的速度和效率。並且需要額外的計算處理清除多餘疊加進去的數值 。

⑩ oracle中的over函數怎麼用的,什麼意思

over函數是oracle中的分析函數,分析函數是對行集組進行聚合計算,但是不像普通聚合仗函數那樣每組只返回一個值,分析函數可以為每組返回多個值。

使用方法為:over(partition by排 列名1 order by 列名2 ),括弧中的兩個關鍵詞partition by 和order by 可以只出現一個。over() 前面是一個函數,如果是聚合函數,那麼order by 不能一起使用。


(10)sql窗口函數oracle擴展閱讀

在SQL語句中,很多查詢語句需要進行GROUP BY分組匯總,但是一旦經過分組,SELECT返回的記錄孢數就會減少。為了保留所有原始行記錄,並且仍可以進行分組數據分析,分析函數應運而生。

oracle資料庫函數,分析函數用於為行定義一個窗口,對一組值進行操作,不需要使用GROUP BY子句對數據進行分組,能夠在同一行中同時返回基礎行的列和聚合列。

RANK()也為每一組的行生成一個序號,與ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值會生成相同的序號,並且接下來的序號是不連序的。例如兩個相同的行生成序號3,那麼接下來會生成序號。

DENSE_RANK()和RANK()類似,不同的是如果有相同的序號,那麼接下來的序號不會間斷。也就是說如果兩個相同的行生成序號,那麼接下來生成的序號還是。