? ? ? ?MySQL從8.0開始支持窗口函數(shù)(Window Functions),因其經(jīng)常被用在數(shù)據(jù)分析的場(chǎng)景,窗口函數(shù)也被稱為分析函數(shù)(Analytic Functions)。
目錄
一、窗口函數(shù)概念
二、基礎(chǔ)語(yǔ)法
2.1 窗口的定義
2.2 命名窗口
三、專用窗口函數(shù)
3.1 row_number()
3.2 rank()
3.3 dense_rank()
3.4 percent_rank()
3.5 cume_dist()
3.6 first_value()
3.7 last_value()
3.8 nth_value()
3.9 lag()
3.10 lead()
3.11 ntile()
四、窗口函數(shù)框架
4.1 框架的定義
4.2 框架定義示例
4.3 框架單位rows和range的區(qū)別
4.4 缺少order by子句時(shí)的默認(rèn)框架
一、窗口函數(shù)概念
窗口的意思是將數(shù)據(jù)進(jìn)行分組,每個(gè)分組即是一個(gè)窗口,這和使用聚合函數(shù)時(shí)的group by分組類似,但與聚合函數(shù)不同的地方是:
- 聚合函數(shù)(例如:sum/avg/min/max)會(huì)針對(duì)每個(gè)分組(窗口)聚合出一個(gè)結(jié)果(每一組返回一個(gè)結(jié)果)。
- 窗口函數(shù)會(huì)對(duì)每一條數(shù)據(jù)進(jìn)行計(jì)算,并不會(huì)使返回的數(shù)據(jù)變少(每一行返回一個(gè)結(jié)果)。
窗口函數(shù)會(huì)逐行計(jì)算,其重點(diǎn)是計(jì)算當(dāng)前行與窗口內(nèi)其他成員之間的關(guān)系,例如:組內(nèi)排序,累積分布等。
窗口函數(shù)可以分為兩類:
- 一類既可以做為聚合函數(shù),也可以作為窗口函數(shù),當(dāng)函數(shù)單獨(dú)使用時(shí)是聚合函數(shù),當(dāng)與over關(guān)鍵字同時(shí)使用時(shí)作為窗口函數(shù)。
- 另一類是專用窗口函數(shù),他們必須與 over 關(guān)鍵字同時(shí)使用。
判斷一個(gè)函數(shù)是不是窗口函數(shù)只需要盯著是否有 over 關(guān)鍵字即可。
二、基礎(chǔ)語(yǔ)法
窗口函數(shù)在使用時(shí)需要定義一個(gè)窗口(分組),然后對(duì)每一行應(yīng)用窗口函數(shù),正在計(jì)算的這行叫做"當(dāng)前行"(current row)。
2.1 窗口的定義
在使用聚合函數(shù)的時(shí)候我們通過(guò) group by 關(guān)鍵字來(lái)定義如何分組,而窗口函數(shù)是通過(guò) over 關(guān)鍵字和 partition by 關(guān)鍵字來(lái)定義分組(這里的 partition by 是分組的意思,和分區(qū)表沒(méi)有任何關(guān)系)。
下面用一組示例來(lái)說(shuō)明,先創(chuàng)建實(shí)驗(yàn)數(shù)據(jù):
create table wf_example(
id smallint unsigned not null auto_increment primary key,
wind varchar(32),
val smallint);
insert into wf_example values
(null,'Window_A',1),
(null,'Window_A',2),
(null,'Window_A',2),
(null,'Window_A',3),
(null,'Window_A',3),
(null,'Window_A',3),
(null,'Window_B',100),
(null,'Window_B',200),
(null,'Window_B',300),
(null,'Window_B',400),
(null,'Window_B',500);
select * from wf_example;
對(duì)于 sum() 函數(shù)我們先作為聚合函數(shù),按照wind列進(jìn)行分組,求val列的和:
select wind,sum(val) from wf_example group by wind;
這是最簡(jiǎn)單的聚合函數(shù)示例,sum按wind列對(duì)數(shù)據(jù)分組后求和,每組分別返回一條數(shù)據(jù)。
下面在將 sum() 作為窗口函數(shù)使用:
select wind,
sum(val) over () total_sum,
sum(val) over (partition by wind) group_sum
from wf_example;
這里我們?cè)?sum 后增加了一個(gè) over 關(guān)鍵字(代表sum作為窗口函數(shù)),over關(guān)鍵字后面括號(hào)中即是窗口定義。
從返回結(jié)果我們看到 sum() 針對(duì)每一行都進(jìn)行計(jì)算并返回了數(shù)據(jù):
- total_sum中我們?cè)趏ver后面使用了一個(gè)空括號(hào),沒(méi)有明確的窗口劃分,代表所有數(shù)據(jù)作為一組。
- group_sum中,我們通過(guò)partition by wind 表示通過(guò)wind列進(jìn)行分組,可以看到求和被限制在Window_A和Window_B組內(nèi)。
2.2 命名窗口
當(dāng)一個(gè)窗口被多次引用的時(shí)候,在每個(gè)over后面都寫一遍定義就顯得有些繁瑣了,此場(chǎng)景可以通過(guò)命名窗口優(yōu)化:一次定義,多次引用。
命名窗口的定義是通過(guò) window wind_name as () 來(lái)進(jìn)行定義的,括號(hào)內(nèi)的部分就是原over子句后的窗口定義,在用over關(guān)鍵字調(diào)用窗口時(shí),直接引用窗口名wind_name即可:
select wind,
sum(val) over w group_sum?? -- 通過(guò)名稱 w 引用窗口
from wf_example
window w as (partition by wind);? -- 命名窗口定義
通常情況下使用時(shí)只需要直接引用窗口名稱即可,有時(shí)需要對(duì)窗口進(jìn)一步加工,例如排序等,可以用括號(hào)將窗口名擴(kuò)起來(lái),后面跟上order by 子句:
select wind,
first_value(val) over (w order by val desc) first_val_desc, -- 通過(guò)窗口名引用,并降序排列
first_value(val) over (w order by val asc) first_val_asc? -- 通過(guò)窗口名引用,并升序排列
from wf_example
window w as (partition by wind);? -- 命名窗口定義
三、專用窗口函數(shù)
除了上面示例的sum,其他的聚合函數(shù)例如count, max, min, avg等都可以作為窗口函數(shù)使用,但是專用窗口函數(shù)在數(shù)據(jù)分析中更加常用。專用窗口函數(shù)在使用時(shí)必須搭配 over 關(guān)鍵字。
3.1 row_number()
語(yǔ)法:row_number() over window
沒(méi)有參數(shù),返回當(dāng)前行在組內(nèi)的位置編號(hào),從1開始,order by子句會(huì)影響行的編號(hào)順序,如果沒(méi)有order by,那么行的編號(hào)是不確定的。另外,即使行完全相同,它們的編號(hào)也是不同的,這點(diǎn)和后面的 rank() 和 dense_rank() 不同。
select wind, val,
row_number() over w 組內(nèi)編號(hào)
from wf_example
window w as (partition by wind);
上面示例中:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-668969.html
- 每一行都有唯一的編號(hào),從1開始,即使數(shù)據(jù)完全相同,編號(hào)也不同。
3.2 rank()
語(yǔ)法:rank() over window
沒(méi)有參數(shù),返回當(dāng)前行在組內(nèi)的排序,排序帶間隙(排名數(shù)字不連續(xù)),在partition by 后面可以跟上order by 子句來(lái)指定按某列排序,示例中按照val值升序排列:
select wind,val,
rank() over (partition by wind order by val) 帶間隙排序
from wf_example;
上面示例中:
- order by val 定義了按照 val 的值排序,注意相同的值,排序也相同,如果沒(méi)有 order by val子句,那么所有行的排序都是1。
- Window_A中,由于存在兩個(gè)2,因此下一個(gè)排序是4,排序存在間隙。
3.3 dense_rank()
語(yǔ)法:dense_rank() over window
沒(méi)有參數(shù),返回當(dāng)前行在組內(nèi)的排序,排序不帶間隙(排名是連續(xù)的):
select wind, val,
rank() over (partition by wind order by val) 帶間隙排序,
dense_rank() over (partition by wind order by val) 不帶間隙排序
from wf_example;
上面示例中:
- Window_A的組內(nèi)排序中,雖然存在2個(gè)2,下一個(gè)排序依然是3,排序不存在間隙。
3.4 percent_rank()
語(yǔ)法:percent_rank() over window
百分比排序,返回當(dāng)前行在組內(nèi)的百分比位置,返回值范圍為[0, 1],可以用 當(dāng)前行排序/(行數(shù)-1) 計(jì)算得出,但與rank不同,這里排序是從0開始而不是從1(相當(dāng)于rank-1),因此第1行的百分比位置是0%,相當(dāng)于:(rank-1)/(rows-1)。
select wind,val,
rank() over (partition by wind order by val) 帶間隙排序,
percent_rank() over (partition by wind order by val) 百分比排序
from wf_example;
上面示例中:
- window_A中第1行rank為1,組內(nèi)rows為6,代入(rank-1)/(rows-1)得到percent_rank為 (1-1)/(6-1),結(jié)果為0.
- Window_A中第3行rank為2(和第2行并列第2),組內(nèi)rows為6,代入(rank-1)/(rows-1)得到percent_rank為 (2-1)/(6-1),結(jié)果為0.2。
- window_B中最后一行rank為5,rows為5,代入(rank-1)/(rows-1)得到percent_rank為 (5-1)/(5-1),結(jié)果為1.
3.5 cume_dist()
語(yǔ)法:cume_dist() over window
累積分布(cumulative distribution)。返回 "當(dāng)前行之前" 與 "和當(dāng)前行相等(包含當(dāng)前行)" 的行數(shù),占組內(nèi)行數(shù)的百分比。
(當(dāng)前行及之前行數(shù) + 和當(dāng)前行相等的行數(shù))/組內(nèi)數(shù)量,這個(gè)和rank類似,但是統(tǒng)計(jì)的是一個(gè)累積的比例,數(shù)據(jù)分布從0到1.
select wind,val,
rank() over w 行編號(hào),
percent_rank() over w 百分比排序,
cume_dist() over w 累積比例
from wf_example
window w as (partition by wind order by val);
上面示例中:
- Window_A中,第1行為獨(dú)立一行,前面沒(méi)有行,也沒(méi)有和自己相同的行,因此累積數(shù)量為1,累積比例為:1/6,即0.166666666
- Window_A中,第2行,累積數(shù)量為:前面的1行,自己第2行,和自己相等的第3行,因此累積數(shù)量為3,累積比例為:3/6,即0.5
- Window_A中,第4行,累積數(shù)量為:前面的3行,自己第4行,和自己相等的第5,6行,因此累積數(shù)量為6,累積比例為:6/6,即1。
- Window_B中,每一行都是獨(dú)立的,不存在和自己相同的行,行編號(hào)就包含了自己及之前所有的行,因此每行的累積比例都是:行編號(hào)/組內(nèi)行數(shù)
3.6 first_value()
語(yǔ)法:first_value(expr) over window
返回當(dāng)前框架內(nèi)第一行計(jì)算出的expr值,第一個(gè)值會(huì)隨著排序定義而不同。
這里引入了一個(gè)重要概念:框架(frame),框架是一個(gè)動(dòng)態(tài)的概念,是組的子集,first_value中每一行的默認(rèn)框架由3部分組成:
- 當(dāng)前行之前的所有行
- 當(dāng)前行
- 和當(dāng)前行相同的行
這3部分相當(dāng)于框架定義:range between unbound preceding and current row,框架定義語(yǔ)法在后面解釋。
select wind,val,
first_value(val) over (w order by val desc) 指定列倒序框架內(nèi)第一個(gè)值,
first_value(val) over (w order by val asc) 指定列正序框架內(nèi)第一個(gè)值
from wf_example
window w as (partition by wind);
上面示例中:
- window_B中當(dāng) order by val desc 時(shí),框架內(nèi)第一個(gè)值是500,這里直接取列的值,你也可以替換為表達(dá)式。
- window_B中當(dāng) order by val asc 時(shí),框架內(nèi)第一個(gè)值是100。
3.7 last_value()
語(yǔ)法:last_value(expr) over window
last_value返回當(dāng)前框架的最后一行計(jì)算出的expr值,從last_value函數(shù)可以更好看出框架的動(dòng)態(tài)變化:
select wind,val,
last_value(val*10) over w 框架內(nèi)最后一個(gè)值的十倍
from wf_example
window w as (partition by wind order by val);
上面的示例中:
- Window_B中,last_value(val*10)返回的值每一行都不同,截止當(dāng)前行的框架內(nèi)最后一個(gè)值(就是當(dāng)前行自己),而不是整個(gè)組的最后一個(gè)值。
3.8 nth_value()
語(yǔ)法:nth_value(expr, N)? over window
返回框架內(nèi)的第N行計(jì)算出的表達(dá)式expr值,當(dāng)沒(méi)有時(shí)返回null:
select wind,val,
nth_value(val, 2) over w? 框架內(nèi)第二個(gè)值,
nth_value(val, 3) over w? 框架內(nèi)第三個(gè)值,
nth_value(val, 4) over w? 框架內(nèi)第四個(gè)值
from wf_example
window w as (partition by wind order by val);
上面的示例中:
- nth_value(val, 2) 返回框架內(nèi)第二個(gè)值,第1行計(jì)算時(shí)由于框架只有一行,沒(méi)有第二個(gè)值,所以返回null。
- nth_value(val, 3) 返回框架內(nèi)第三個(gè)值,注意window_A由于2,3行val是相等的,計(jì)算第二行時(shí)的框架會(huì)包含第三行,而Window_B是獨(dú)立的,第二行返回null。
- nth_value(val, 4) 返回框架內(nèi)第四個(gè)值,window_A和Window_B都在第四行才取到值,前三行都是null。
3.9 lag()
語(yǔ)法:lag(expr [, N [, default]])
返回在當(dāng)前窗口內(nèi),當(dāng)前行的“前面N行”計(jì)算出的expr結(jié)果,如果沒(méi)有滿足條件的行,則返回default,其中參數(shù)N和default可以省略,如果省略了則默認(rèn)N為1,default為null。
select wind,val,
lag(val*10) over w? 當(dāng)前行前面一個(gè)值,
lag(val*10,1,'不存在') over w? 當(dāng)前行前面一個(gè)值帶默認(rèn)值,
val-lag(val,2) over w 當(dāng)前值與前兩個(gè)值的差
from wf_example
window w as (partition by wind order by val);
上面的示例中:
- lag(val*10) 返回前一行表達(dá)式val*10計(jì)算值(N參數(shù)省略,默認(rèn)為1,default參數(shù)省略,默認(rèn)為nulll,第一行沒(méi)有前一行,返回null)
- lag(val*10,1,'不存在') 返回前一行表達(dá)式val*10計(jì)算值(default為"不存在",因此第一行返回字符串"不存在")
- val-lag(val,2) 計(jì)算當(dāng)前行與前2行之間的差額
3.10 lead()
語(yǔ)法:lead(expr [N [, default]])
lead() 和lag() 類似,返回在當(dāng)前窗口內(nèi),當(dāng)前行的“后面N行”計(jì)算出的expr結(jié)果,如果沒(méi)有滿足條件的行,則返回default,其中參數(shù)N和default可以省略,如果省略了則默認(rèn)N為1,default為null。
select wind,val,
lead(val*10) over w? 當(dāng)前行后面一個(gè)值的十倍,
lead(val*10,1,'不存在') over w? 當(dāng)前行后面一個(gè)值十倍帶默認(rèn)值,
val-lead(val,2) over w 當(dāng)前行與后面第二個(gè)值的差
from wf_example
window w as (partition by wind order by val);
上面的示例中:
- lead(val*10) 返回后一行表達(dá)式val*10計(jì)算值(N參數(shù)省略,默認(rèn)為1,default參數(shù)省略,默認(rèn)為null,最后一行由于沒(méi)有后一行,返回null)
- lag(val*10,1,'不存在') 返回后一行表達(dá)式val*10計(jì)算值(default為"不存在",因此最后一行返回字符串"不存在")
- val-lead(val,2) 計(jì)算當(dāng)前行與后面第2行之間的差額
3.11 ntile()
語(yǔ)法:ntile(N) over window
將組內(nèi)成員再次分為N個(gè)小組(子分組/buckets),返回子分組的編號(hào)。
select wind,val,
ntile(2) over w 將每個(gè)組再次分為2個(gè)組,
ntile(4) over w 將每個(gè)組再次分為4個(gè)組,
ntile(100) over w 將每個(gè)組再次分為100個(gè)組
from wf_example
window w as (partition by wind order by val);
上面示例中:
- ntile(2) 將每個(gè)組再次分為2個(gè)組,并返回每一行所屬子分組的編號(hào)
- ntile(100) 當(dāng)組的數(shù)量超過(guò)行數(shù)時(shí),每一行都是一個(gè)獨(dú)立子分組。
四、窗口函數(shù)框架
框架(frame)是窗口的一個(gè)子集,它會(huì)根據(jù)當(dāng)前行動(dòng)態(tài)變化。在前面在first_vlalue和 last_value 函數(shù)中,我們提到了框架的定義,它們默認(rèn)的框架是從組內(nèi)第一行到當(dāng)前行(也包含和當(dāng)前行相等的行)。
窗口函數(shù)還支持框架子句,讓你可以顯式定義框架的范圍,根據(jù)當(dāng)前行的位置,來(lái)計(jì)算組內(nèi)一小部分集合的數(shù)據(jù)。
4.1 框架的定義
框架的定義語(yǔ)法:frame_units frame_extent
框架的定義由frame_units(框架單位)和 frame_extent(框架范圍)兩子句組成。
當(dāng)定義框架時(shí),我們首先要指定框架使用的單位(frame_units子句),框架單位可以有2種選擇:
rows:通過(guò)起始行和結(jié)束行來(lái)劃定框架的范圍,邊界是明確的一行。
range:通過(guò)具有相同值的行來(lái)劃定框架的范圍,邊界是一個(gè)范圍,具有相同值的行作為一個(gè)整體看待。
定義好單位后,我們還需要定義框架范圍(frame_extent子句),也有兩種定義方式:
- 只定義起始點(diǎn)(frame_start),終止點(diǎn)(frame_end)默認(rèn)就是當(dāng)前行。
- 通過(guò)between frame_start and frame_end 子句,同時(shí)定義起始點(diǎn)(frame_start)和終止點(diǎn) (frame_end)。
合法的frame_start和frame_end可以有如下5種選擇:
- current row:當(dāng)框架單位是rows時(shí),即當(dāng)前行。當(dāng)框架單位是range時(shí),包含當(dāng)前行和當(dāng)前行相同的行(一個(gè)范圍)。
- unbound preceding:窗口內(nèi)第1行。
- unbound following:窗口內(nèi)最后1行。
- expr preceding:當(dāng)框架單位是rows時(shí), 邊界時(shí)當(dāng)前行的前expr行。當(dāng)框架單位是range時(shí),邊界是值和"當(dāng)前行的值-expr"相等的行,如果當(dāng)前行的值是null,那邊界就是和當(dāng)前行相等的行。
- expr following:當(dāng)框架單位是rows時(shí), 邊界時(shí)當(dāng)前行的后expr行。當(dāng)框架單位是range時(shí),邊界時(shí)和"當(dāng)前行的值+expr"相等的行,如果當(dāng)前行的值是null,那邊界就是和當(dāng)前行相等的行。
光看定義可能有些晦澀,我們通過(guò)幾個(gè)示例來(lái)幫助理解。
4.2 框架定義示例
我們用幾個(gè)示例來(lái)加深對(duì)框架定義的理解:
select wind,val,
last_value(val*10) over (partition by wind order by val rows unbounded preceding) 顯式定義框架內(nèi)最后一個(gè)值的十倍
from wf_example;
上面示例中:
- 框架的定義是rows unbouned preceding。
- 框架單位是rows(行),框架范圍是unbounded preceding(組內(nèi)第1行)。
- 這里采用了僅定義起始點(diǎn)的方式,框架的終止點(diǎn)默認(rèn)就是當(dāng)前行(current row),定義等同于:rows between unbound preceding and current row
下面的示例為滾動(dòng)求和,計(jì)算當(dāng)前行和前一行的和:
select wind,val,
sum(val) over (partition by wind order by val rows 1 preceding) 當(dāng)前行和前1行的和,
sum(val) over (partition by wind order by val rows between 1 preceding and current row) 第二種定義方式
from wf_example;
上面示例中:
- 第一個(gè)框架的定義是rows 1 preceding,框架單位是rows(行),
- 第一個(gè)框架范圍是1 preceding(當(dāng)框架單位為rows時(shí),1 preceding 代表當(dāng)前行的前1行).
- 第一個(gè)框架采用了僅定義起始點(diǎn)的方式,框架的終止點(diǎn)默認(rèn)就是當(dāng)前行。
- 第二個(gè)框架采用了between 1 preceding and current row的方式,顯式指定了框架的起始和結(jié)束范圍,效果是相同的。
4.3 框架單位rows和range的區(qū)別
這里僅僅將上一個(gè)滾動(dòng)求和SQL中的框架單位定義由rows改為range,再看一下效果:
select wind,val,
sum(val) over (partition by wind order by val range 1 preceding) range單位下當(dāng)前行和當(dāng)前行值減1范圍的和
from wf_example;
上面示例中,當(dāng)框架單位變?yōu)閞ange時(shí):
- 框架定義為 range 1 preceding,等價(jià)于 range between 1 preceding and current row。
- 當(dāng)框架單位為range時(shí),這里的1 preceding不再是前1行的意思,而是"當(dāng)前行的值-1"。
- 而range between 1 preceding and current row 代表值的范圍落在區(qū)間 [當(dāng)前行值-1,當(dāng)前行值] 內(nèi)所有行。
- 在Window_A中,第二行val值為2,因此框架包含值在 [2-1, 2] 范圍內(nèi)的所有行,即1,2,3行,sum求和結(jié)果為5,第三行同理。
- 在Window_A中,第四行val值為3,因此框架包含值在 [3-1, 3] 范圍內(nèi)的所有行,即2,3,4,5,6行,sum求和結(jié)果為13,第五、六行同理。
- 在Window_B中,第2行val值為200,因此框架包含值在[200-1, 200]范圍內(nèi)的所有所有行,只有第二行,sum求和結(jié)果就是自己,后面的行同理。
上面的SQL通過(guò)加入first_value和last_value函數(shù)我們可以更直觀的看出框架的邊界(first_value返回框架內(nèi)第1個(gè)值,last_value返回框架內(nèi)最后一個(gè)值):
select wind,val,
sum(val) over (partition by wind order by val range 1 preceding) range單位下當(dāng)前行和當(dāng)前行值減1范圍的和,
first_value(val) over (partition by wind order by val range 1 preceding) first_val,
last_value(val) over (partition by wind order by val range 1 preceding) last_val
from wf_example;
- 在Window_A中,val的值差距為1,因此 range 1 preceding可以觸及前面的行。
- 在Window_B中,val的值差距為100,因此range 1 preceding無(wú)法觸及前面的行(first_value和last_value都是自己),每一行的框架都只包含當(dāng)前行自己。
但如果我們把range 1 preceding改成 range 100 preceding,則Window_B中框架可以觸及前面的行:
select wind,val,
sum(val) over (partition by wind order by val range 100 preceding) range單位下當(dāng)前行和當(dāng)前行值減1范圍的和,
first_value(val) over (partition by wind order by val range 100 preceding) first_val,
last_value(val) over (partition by wind order by val range 100 preceding) last_val
from wf_example;
可以看到Window_B中求和列變成了當(dāng)前行和前1行的val的和,同時(shí)框架的first_val變成了前1行的值(代表當(dāng)前行的框架包含前1行)。
框架單位rows和range的區(qū)別總結(jié)就是:
- rows是通過(guò)行來(lái)劃分邊界,框架邊界是明確的某一行。
- range是通過(guò)值來(lái)劃定邊界,框架邊界是具有某個(gè)值的所有行。
4.4 缺少order by子句時(shí)的默認(rèn)框架
當(dāng)沒(méi)有顯式的框架定義時(shí),某些函數(shù)會(huì)采用默認(rèn)框架定義,而默認(rèn)框架定義會(huì)受到是否有order by子句影響,因此是否有order by子句可能會(huì)導(dǎo)致某些函數(shù)的計(jì)算結(jié)果不同。
根據(jù)窗口定義是否有order by子句:
- 有 order by 子句時(shí),默認(rèn)的框架定義是:range between unbound preceding and current row
- 沒(méi)有 order by 子句時(shí),默認(rèn)的框架定義是:range between unbound preceding and unbound following
即:當(dāng)有order by 子句時(shí),框架是從組內(nèi)第一行到當(dāng)前行(注意框架單位是range,也包含當(dāng)前行相同值的行)。當(dāng)沒(méi)有order by 子句時(shí),框架就是從組內(nèi)第1行到最后一行(組內(nèi)所有行),所有的行都是相等的。
我們通過(guò)最初的sum函數(shù)來(lái)觀察這種默認(rèn)框架的區(qū)別:
select wind,val,
sum(val) over (partition by wind order by val) 帶orderby子句,
sum(val) over (partition by wind) 不帶orderby子句
from wf_example;
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-668969.html
上面示例中:
- 帶order by子句時(shí),sum函數(shù)求和范圍是第1行到當(dāng)前行(包含和當(dāng)前行相等的行)的和,sum的結(jié)果是遞增的。
- 不帶order by 子句時(shí),每一行sum,求出來(lái)都是組內(nèi)全部行的和,沒(méi)有order by子句,眾生平等。
到了這里,關(guān)于MySQL窗口函數(shù)(MySQL Window Functions)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!