<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
簡單來說,視窗函數有以下功能:
1)同時具有分組和排序的功能
2)不減少原表的行數
3)語法如下:
<視窗函數> over (partition by <用於分組的列名> order by <用於排序的列名> [rows between ?? and ???])
<視窗函數>的位置,可以放以下兩種函數:
1) 專用視窗函數,包括後面要講到的rank, dense_rank, row_number等專用視窗函數。
2) 聚合函數,如sum(). avg(), count(), max(), min()等,rows between…and…
因為視窗函數是對where或者group by子句處理後的結果進行操作,所以視窗函數原則上只能寫在select子句中。
3)業務需求“在每組內排名”,比如:
-- 如果我們想在每個班級內按成績排名,得到下面的結果。 select *, rank() over (partition by 班級 order by 成績 desc) as ranking from 班級表;
我們來解釋下這個sql語句裡的select子句。rank是排序的函數。要求是“每個班級內按成績排名”,這句話可以分為兩部分:
1)每個班級內:按班級分組
partition by
用來對錶分組。在這個例子中,所以我們指定了按“班級”分組(partition by 班級)2)按成績排名
order by
子句的功能是對分組後的結果進行排序,預設是按照升序(asc)排列。在本例中(order by 成績 desc)是按成績這一列排序,加了desc關鍵詞表示降序排列。通過下圖,我們就可以理解partiition by(分組)和order by(在組內排序)的作用了。
group by分組彙總後改變了表的行數,一行只有一個類別。而partiition by和rank函數不會減少原表中的行數。
注意事項:
select *, rank() over (order by 成績 desc) as ranking, dense_rank() over (order by 成績 desc) as dese_rank, row_number() over (order by 成績 desc) as row_num from 班級表
得到結果:
從上面的結果可以看出:
rank
函數:這個例子中是5位,5位,5位,8位元,也就是如果有並列名次的行,會佔用下一名次的位置。比如正常排名是1,2,3,4,但是現在前3名是並列的名次,結果是:1,1,1,4。dense_rank
函數:這個例子中是5位,5位,5位,6位,也就是如果有並列名次的行,不佔用下一名次的位置。比如正常排名是1,2,3,4,但是現在前3名是並列的名次,結果是:1,1,1,2。row_number
函數:這個例子中是5位,6位,7位,8位元,也就是不考慮並列名次的情況。比如前3名是並列的名次,排名是正常的1,2,3,4。LAG(col,n,default_val)
:獲取往前第n行資料,col是列名,n是往上的行數,當第n行為null的時候取default_valLEAD(col,n, default_val)
:往後第n行資料,col是列名,n是往下的行數,當第n行為null的時候取default_valNTILE(n)
:把有序分割區中的行分發到指定資料的組中,各個組有編號,編號從1開始,對於每一行,NTILE返回此行所屬的組的編號。cume_dist()
,計算某個視窗或分割區中某個值的累積分佈。假定升序排序,則使用以下公式確定累積分佈:小於等於當前值x的行數 / 視窗或partition分割區內的總行數。其中,x 等於 order by 子句中指定的列的當前行中的值。
聚和視窗函數和上面提到的專用視窗函數用法完全相同,只需要把聚合函數寫在視窗函數的位置即可,但是函數後面括號裡面不能為空,需要指定聚合的列名。
我們來看一下視窗函數是聚合函數時,會出來什麼結果:
select *, sum(成績) over (order by 學號) as current_sum, avg(成績) over (order by 學號) as current_avg, count(成績) over (order by 學號) as current_count, max(成績) over (order by 學號) as current_max, min(成績) over (order by 學號) as current_min from 班級表
如上圖,聚合函數sum在視窗函數中,是對自身記錄、及位於自身記錄以上的資料進行求和的結果。比如0004號,在使用sum視窗函數後的結果,是對0001,0002,0003,0004號的成績求和,若是0005號,則結果是0001號~0005號成績的求和,以此類推。
不僅是sum求和,平均、計數、最大最小值,也是同理,都是針對自身記錄、以及自身記錄之上的所有資料進行計算,
這樣使用視窗函數有什麼用呢?
聚合函數作為視窗函數,可以在每一行的資料裡直觀的看到,截止到本行資料,統計資料是多少(最大值、最小值等)。同時可以看出每一行資料,對整體統計資料的影響。
sum()/... over ([partition by 列名] [order by 列名] [rows between ... and ...] ) -- 從起點到當前行資料聚合 between unbounded preceding and current row -- 往前2行到往後1行的資料聚合 between 2 preceding and 1 following
rows必須跟在Order by 子句之後,對排序的結果進行限制,使用固定的行數來限制分割區中的資料行數量。
OVER()
:指定分析函數工作的資料視窗大小,這個資料視窗大小可能會隨著行的變而變化。CURRENT ROW
:當前行n PRECEDING
:往前n行資料n FOLLOWING
:往後n行資料UNBOUNDED
:起點,unbounded preceding 表示從表資料的起點, unbounded following表示到後面的終點select name,subject,score, sum(score) over() as sum1, sum(score) over(partition by subject) as sum2, sum(score) over(partition by subject order by score) as sum3, -- 由起點到當前行的視窗聚合,和sum3一樣 sum(score) over(partition by subject order by score rows between unbounded preceding and current row) as sum4, -- 當前行和前面一行的視窗聚合 sum(score) over(partition by subject order by score rows between 1 preceding and current row) as sum5, -- 當前行的前面一行和後面一行的視窗聚合 sum(score) over(partition by subject order by score rows between 1 preceding AND 1 following) as sum6, -- 當前和後面所有的行 sum(score) over(partition by subject order by score rows between current row and unbounded following) as sum7 from t_fraction; +-------+----------+--------+-------+-------+-------+-------+-------+-------+-------+ | name | subject | score | sum1 | sum2 | sum3 | sum4 | sum5 | sum6 | sum7 | +-------+----------+--------+-------+-------+-------+-------+-------+-------+-------+ | 孫悟空 | 數學 | 12 | 359 | 185 | 12 | 12 | 12 | 31 | 185 | | 沙悟淨 | 數學 | 19 | 359 | 185 | 31 | 31 | 31 | 104 | 173 | | 豬八戒 | 數學 | 73 | 359 | 185 | 104 | 104 | 92 | 173 | 154 | | 唐玄奘 | 數學 | 81 | 359 | 185 | 185 | 185 | 154 | 154 | 81 | | 豬八戒 | 英語 | 11 | 359 | 80 | 11 | 11 | 11 | 26 | 80 | | 孫悟空 | 英語 | 15 | 359 | 80 | 26 | 26 | 26 | 49 | 69 | | 唐玄奘 | 英語 | 23 | 359 | 80 | 49 | 49 | 38 | 69 | 54 | | 沙悟淨 | 英語 | 31 | 359 | 80 | 80 | 80 | 54 | 54 | 31 | | 孫悟空 | 語文 | 10 | 359 | 94 | 10 | 10 | 10 | 31 | 94 | | 唐玄奘 | 語文 | 21 | 359 | 94 | 31 | 31 | 31 | 53 | 84 | | 沙悟淨 | 語文 | 22 | 359 | 94 | 53 | 53 | 43 | 84 | 63 | | 豬八戒 | 語文 | 41 | 359 | 94 | 94 | 94 | 63 | 63 | 41 | +-------+----------+--------+-------+-------+-------+-------+-------+-------+-------+
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45