簡單易懂的SQL的視窗函式 案例清晰

2021-10-08 18:26:24 字數 2090 閱讀 4568

視窗函式怎樣寫?(很簡單哦)

視窗函式有哪些?(也很簡單哦)

視窗函式是分析函式,聚合函式是統計函式。

普通常用的聚合函式只能返回乙個值,而視窗函式每一行都能返回乙個值。

舉個例子:檢視每乙個班級的總分數。

首先表結構大概為這個樣子:

普通的聚合函式實現為:

而視窗函式的實現為:

通過這兩種情況的比較,可以看出來:

1.普通的聚合函式側重於統計出結果,假如你想分析一下前30名同學的總成績的話是沒有辦法實現的,所以說普通函式最後生成乙個值,也就是按照班級進行分組後取第一行。

2.聚合函式側重於對過程的分析,對總成績的變化分析等等,也就是每一行會生成乙個值,在這裡就是對總成績的累加。

視窗函式+over(分割槽+排序+範圍)

例如:rank() over(partition by 班級 order by 合計) as 排名

解釋:首先是你需要用的視窗函式,其次在over子句中進行動態的分割槽或者排序(分割槽就相當於group by),所以視窗函式由三部分組成:分割槽,排序和範圍。

注意:分割槽、排序和範圍為可選項,可以按照需求選擇,而over子句一定要有,所以rank() over()也是正確的,對範圍rows的介紹在聚合視窗函式部分著重介紹,像rank()這類的函式基本上不會用到rows,所以預設是表頭到表尾,即整張表。

1.排序函式

排序函式分為四種排序函式,分別是row_number()、rank()、dense_rank()、ntile()。

注意:over()裡面的分組以及排序的執行晚於 where 、group by、 order by 的執行,同時要注意group by 只返回查詢到的第一行,關於group by 和order by 一起使用的注意事項我會另外談

2.偏移函式

從圖中可以看出來,first_value()的結果值是不變的,為什麼不變呢,因為結果集是遍歷表的過程中一行一行新增的,所以第乙個值是不變的,因為後面遍歷的結果都是新增在第一行的下面的。但是last_value()的結果值就不同了,遍歷的過程中每次新增一行,這一行就是最後一行,所以last_value表示的就是當前行的合計成績,因為當前行就是當前結果集的最後一行。(從這一點也可以看出視窗函式是注重過程的,過程都會記錄,方便分析使用,同時也能看出over子句動態分割槽排序的特點)

3.聚合函式

大家對over子句中的partition by 和order by 都有了解了吧,在介紹聚合函式			前,先說一下語法的最後乙個部分-rows。

格式為rows between···and···,也就是取乙個範圍,也就是所說的視窗。

當前行-current row

之前的行-preceding

之後的行-following

無界限-unbounded

表示從前面的起點-unbounded preceding

表示到後面的終點-unbounded following

不理解的話沒關係,舉幾個例子就容易理解了。

取當前行和前五行:rows between 5 preceding and current row

取當前行和後五行:rows between current row and 5 following

取前五行和後五行:rows between 5 preceding and 5 folowing

注意:在前面的行要寫在前面,假如取當前行和前五行改一下:rows between current row and 5 preceding 這樣寫就是錯誤的。

下面介紹聚合函式。

4.分布函式

簡單易懂的巨集使用說明案例

再來說明 前幾天改乙份老 用,乙份錯誤為了糾錯而糾錯將 寫的很長的 150多行,實際操作只有70行。一篇 螢幕都看不到一對 所以在這裡給跟我原來一樣的人,講講巨集,能幫你讓 可讀性更好,更便於維護。18 include 19 include 20 define to char type 注釋必須用斜...

簡單易懂的udp

udp 是一種簡單傳輸協議,實現簡單,占用系統資源少 客戶端服務端 coding utf 8 import time from socket import 建立簡單的udp服務端 建立套接字 soc socket af inet,sock dgram 設定本地位址 local addr 50000 ...

簡單易懂的BFS

bfs從起點開始,優先搜尋離起點最近的點,然後由這個最近的點擴充套件其他稍近的點,這樣一層一層的擴充套件,就像水波擴散一樣。bfs需要借助佇列來實現 初始的時候把起始點放入佇列中,並標記起點訪問 如果佇列不為空,從佇列中取出乙個元素x,否則演算法結束 訪問和x相連的所有點v,如果v沒有被訪問,把v入...