目錄
視窗函式也屬於分析函式。oracle從8.1.6開始提供視窗函式,視窗函式用於計算基於組的某種聚合值,
視窗函式指定了分析函式工作的資料視窗大小,這個資料視窗大小可能會隨著行的變化而變化。
與聚合函式的不同之處是:對於每個組返回多行,而聚合函式對於每個組只返回一行
基本語法: 分析函式 over (partition by 用於分組的列名 order by 用於排序的列名)。
語法中的分析函式主要由序列函式(rank、dense_rank和row_number等組成)
與聚合函式(sum、**g、count、max和min程式設計客棧等)作為視窗函式組成。
從視窗函式組成上看,它是group by 和 order by的功能組合,group by分組彙總後改變了表的行數,一行只有乙個類別,而partiition by則不會減少原表中的行數。
恰如視窗函式的組成,它同時具有分組和排序的功能,且不減少原表的行數。
over 關鍵字表示把函式當成視窗函式而不是聚合函式。sql 標準允許將所有聚合函式用做視窗函式,使用 over 關鍵字來區分這兩種用法。
over 關鍵字後的括號中經常新增選項用以改變進行聚合運算的視窗範圍。如果 over 關鍵字後的括號中的選項為空,則視窗函式會對結果集中的所有行進行聚合運算。
分析函式 over(partition by 列名 order by 列名 rows between 開始位置 and 結束位置)
為什麼叫開窗呢?
因為在over()括號中的,partition() 函式可以將查詢到的資料進行單獨開乙個視窗處理。譬如,查詢每個班級的學生的排名www.cppcns.com情況,查詢每個國家的歷年人口等,諸如此類,都是在查詢到的每乙個班級、每乙個國家中都開乙個視窗,單獨去執行命令。
rows和range分別表示選擇後幾行、選擇資料範圍
理解 rows between 含義,也叫做window子句:
preceding:往前following:往後current row:當前行unbounded:無邊界,unbounded precending 表示從最前面的起點開始, unbounded following:表示到最後面的終點注:不加 partition by 的話則把整個資料集當作乙個分割槽,不加 order by的話會對某些函式統計結果產生影響,如sum()
1.聚合函式
聚合函式
定義sum()
求和max()
求最大值
min()
求最小值
**g()
求平均值
count()
統計數2.序列函式
序列函式
定義row_number()
按照值排序時產生乙個自增編號,值相等時不會重複,不會產生空位
rank()
按照值排序時產生乙個自增編號,值相等時會重複,會產生空位
dense_rank()
按照值排序時產生乙個自增編號,值相等時會重複,不會產生空位
row_number()
select * ,row_number()over(oder by 成績 desc) as 排名 from 班級表
查詢結果:
+------------+--------+------+------+------+
| 姓名 | 性別 | 班級 | 成績 | 排名 |
+------------+--------+------+------+------+
| 張三 | 男 | 1 | 100 | 1 |
| 李四 | 女 | 3 | 100 | 2 |
| 張三 | 女 | 1 | 100 | 3 |
| 王五 | 女 | 2 | 99 | 4 |
| 趙四 | 男 | 2 | 90 | 5 |
| 孫六 | 男 | 2 | 90 | 6 |
| 喜羊羊 | 男 | 3 | 85 | 7 |
| 美羊羊 | 女 | 4 | 82 | 8 |
| 懶洋洋 | 女 | 1 | 80 | 9 |
| 慢羊羊 | 女 | 2 | 70 | 10 |
+------------+--------+------+------+------+
rank()
select * ,rank()over(oder by 成績 desc) as 排名 from 班級表
查詢結果:
+------------+--------+------+------+------+
| 姓名 | 性別 | 班級 | 成績 | 排名 |
+------------+--------+------+------+------+
| 張三 | 男 | 1 | 100 | 1 |
| 李四 | 女 | 3 | 100 | 1 |
| 張三 | 女 | 1 | 100 | 1 |
| 王五 | 女 | 2 | 99 | 4 |
| 趙四 | 男 | 2 | 90 | 5 |
| 孫六 | 男 | 2 | 90 | 5 |
| 喜羊羊 | 男 | 3 | 85 | 7 |
| 美羊羊 | 女 | 4 | 82 | 8 |
| 懶洋洋 | 女 | 1 | 80 | 9 |
| 慢羊羊 | 女 | 2 | 70 | 10 |
+------------+--------+------+------+------+
dense_rank()
select * ,row_number()over(oder by 成績 desc) as 排名 from 班級表
查詢結果:
+------------+--------+------+------+------+
| 姓名 | 性別 | 班級 | 成績 | 排名 |
+------------+--------+------+------+------+
| 張三 | 男 | 1 | 100 | 1 |
| 李四 | 女 | 3 | 100 | 1 |
| 張三 | 女 | 1 | 100 | 1 |
| 王五 | 女 | 2 | 99 | 2 |
| 趙四 | 男 | 2 | 90 | 3 |
| 孫六 | 男 | 2 | 90 | 3 |
| 喜羊羊 | 男 | 3 | 85 | 4 |
| 美羊羊 | 女 | 4 | 82 | 5 |
| 懶洋洋 | 女 | 1 | 80 | 6 |
| 慢羊羊 | 女 | 2 | 70 | 7 www.cppcns.com|
+------------+--------+------+------+------+
3.其他類
其他類定義
percent_rank()
分組內當前行的rank值-1/分組內總行數-1
程式設計客棧 lag()
用於統計視窗內往上第n行值 第乙個引數為列名,第二個引數為往上第n行(可選,預設為1),第三個引數為預設值(當往上第n行為null時候,取預設值,如不指定,則為null
lead()
用於統計視窗內往下第n行值 第乙個引數為列名,第二個引數為往下第n行(可選,預設為1),第三個引數為預設值(當往下第n行為null時候,取預設值,如不指定,則為null
ntile()
用於將分組資料按照順序切分成n片,返回當前切片值
first_value()
取分組內排序後,截止到當前行,第乙個值
last_value()
取分組內排序後,截止到當前行,最後乙個值
cume_dist()
返回小於等於當前值的行數/分組內總oadkj行數
partition by 子句:
視窗函式的 over 關鍵字後括號中的可以使用 partition by 子句來定義行的分割槽來供進行聚合計算。
與 group by 子句不同,partition by 子句建立的分割槽是獨立於結果集的,建立的分割槽只是供進行
聚合計算的,而且不同的視窗函式所建立的分割槽也不互相影響。
order by 子句:
視窗函式中可以在over關鍵字後的選項中使用order by 子句來指定排序規則,而且有的視窗函式還
要求必須指定排序規則。使用order by 子句可以對結果集按照指定的排序規則進行排序,並且在乙個
指定的範圍內進行聚合運算。
語法:order by欄位名 range|rows between邊界規則1 and 邊界規則2
partition by子句和order by 可以共同使用,從而可以實現更加複雜的功能
oracle資料庫 日期函式用法
oracle資料庫 日期函式用法 oracle trunc 函式的用法 日期 1.select trunc sysdate from dual 2013 01 06 今天的日期為2013 01 06 2.select trunc sysdate,mm from dual 2013 01 01 返回當...
Oracle資料庫的分析函式
rollup 針對group by 再次統計,作用於區域性字段 根據月份和地區分組,並統計分組的工資總和,分組的最小單位為地區 月份下的不同地區會衍生出多條記錄,因此sum統計的是最小單位的分組記錄 select mouth,area,sum salary from company group by...
Oracle資料庫中count函式的用法
oracle資料庫中count函式的用法 count用來統計查詢結果有幾條記錄 例表 t test 姓名 性別 年齡 工資 張三 男 李四 女 王武 男 簡單應用 查詢 select count from t test 結果 3 解釋 以上查詢將返回表t test中記錄的條數。帶where條件的應用...