窗口函數能夠進行排序,生成序列號等通常的聚合函數沒法實現的高級操做。數據庫
窗口函數也稱爲OLAP函數,意思是對數據庫數據進行實時分析處理。窗口函數就是爲了實現OLAP而添加的標準SQL功能。框架
窗口函數語法:其中[]中的內容能夠省略函數
使用格式: <窗口函數> over ([partition by <列清單>] order by <排序用列清單>)spa
窗口函數大致能夠分爲如下兩種:3d
1.可以做爲窗口函數的聚合函數(sum,avg,count,max,min)code
2.rank,dense_rank。row_number等專用窗口函數。對象
語法的基本使用方法:使用rank函數blog
rank函數是用來計算記錄排序的函數。排序
select product_name, product_type, sale_price, rank () over (partition by product_type order by sale_price) as ranking from Product;
partition by 可以設定排序的對象範圍,相似於group by語句,這裏就是以product_type劃分排序範圍。it
order by可以指定哪一列,何種順序進行排序。也能夠經過asc,desc來指定升序降序。
窗口函數兼具分組和排序兩種功能。經過partition by分組後的記錄集合稱爲窗口。
然而partition by不是窗口函數所必須的:
select product_name, product_type, sale_price, rank () over (order by sale_price) as ranking from Product;
沒有進行範圍的劃分,直接對所有的商品進行排序。
專用函數的種類:1.rank函數:計算排序時,若是存在相同位次的記錄,則會跳過以後的位次。
2.dense_rank函數:一樣是計算排序,即便存在相同位次的記錄,也不會跳過以後的位次。
3.row_number函數:賦予惟一的連續位次。
select product_name, product_type, sale_price, rank () over (order by sale_price) as ranking, dense_rank () over (order by sale_price) as dense_ranking, row_number () over (order by sale_price) as row_num from Product;
因爲窗口函數無需參數,所以一般括號裏都是空的。
窗口函數的適用範圍:只能在select子句中使用。
做爲窗口函數使用的聚合函數:
sum:
select product_id, product_name, sale_price, sum(sale_price) over (order by product_id) as current_sum from Product;
以累計的方式進行計算。
計算出商品編號小於本身的商品的銷售單價的合計值。
avg:
select product_id, product_name, sale_price, avg(sale_price) over (order by product_id) as current_sum from Product;
做爲的統計對象一樣是排在本身之上的記錄。
1行:1000/1
2行:(1000 + 500)/2
3行:(1000+500+4000)/3
...
計算移動平均
窗口函數就是將表以窗口爲單位進行分割,並在其中進行排序的函數。其中還包含在窗口中指定更加詳細的彙總範圍的備選功能,該備選功能中的彙總範圍稱爲框架。
指定最靠近的3行作爲彙總對象:
select product_id, product_name, sale_price, avg (sale_price) over (order by product_id rows 2 preceding) as moving_avg from Product;
指定框架(彙總範圍):這裏使用的rows(行)和preceding(以前)兩個關鍵字,將框架指定爲截止到以前?行,所以rows 2 preceding就是將框架指定爲截止到以前2行,也就是將做爲彙總對象的記錄限定爲以下的最靠近3行
1.自身(當前記錄)
2.以前1行的記錄
3.以前2行的記錄
因此結果:
假設當前行爲3000,前1行記錄爲4000,前兩行記錄爲500,因此(500+4000+3000)/3=2500
這樣的統計方法稱爲移動平均。
使用關鍵字following(以後)替換preceding,就能夠將框架改成截止到以後?行。
將當前記錄的先後行做爲彙總對象:
select product_id, product_name, sale_price, avg(sale_price) over (order by product_id rows between 1 preceding and 1 following) as moving_avg--使用between規劃範圍,語句意思爲rows 1 preceding --到rows 1 following from Product;
語句意思:1.以前1行的記錄
2.自身(當前記錄)
3.以後1行的記錄
整的框架就是這樣
仍是假設3000爲當前記錄,框架計算4000爲前一行記錄,6800爲後一行記錄(4000+3000+6800)/3 = 4600
總行數仍是3.
兩個order by
select product_name, product_type, sale_price, rank() over (order by product_name) as ranking from Product;
這時候價格會顯得混亂不堪
能夠在語句最後添加一個order by子句,來約束sale_price
select product_name, product_type, sale_price, rank() over (order by product_name) as ranking from Product order by sale_price;