SqlServer筆記-窗口函數【未完成】


使用場景:

得到部門中工資排名前N名的員工列表;查找各部門每人工資占部門總工資的百分比。

對於這些場景,使用傳統SQL實現比較困難,這類需求有一個共同特點就是需要在滿足某些條件的記錄集內部做一些函數操作,不是簡單的表連接、聚合就可以實現。

要解決此類問題,最方便的方式就是使用窗口函數。

 

窗口:

窗口的概念非常重要,它可以理解為記錄集合,窗口函數也就是在滿足某種條件的記錄集合上執行的特殊函數。對於每條記錄都要在此窗口內執行函數,有的函數隨着記錄不同,窗口大小都是固定的,這種屬於靜態窗口;有的函數則相反,不同的記錄對應着不同的窗口,這種動態變化的窗口叫滑動窗口。

 

窗口函數語法:

 

<窗口函數> over (partition by <用於分組的列名> order by <用於排序的列名>)

 

 

窗口函數簡單例子:

下面例子中, row_number()over(partition by user_no order by amount desc) 這部分都屬於窗口函數,它的功能是顯示每個用戶按照訂單金額從大到小排序的序號。

 

 

 

 

窗口函數有哪些:

 

1) 專用窗口函數,包括后面要講到的rank, dense_rank, row_number等專用窗口函數。

2) 聚合函數,如sum. avg, count, max, min等

因為窗口函數是對where或者group by子句處理后的結果進行操作,所以窗口函數原則上只能寫在select子句中。

 

窗口函數具備了我們之前學過的group by子句分組的功能和order by子句排序的功能。那么,為什么還要用窗口函數呢?

這是因為,group by分組匯總后改變了表的行數,一行只有一個類別。而partiition by和rank函數不會減少原表中的行數。例如下面統計每個班級的人數。

現在我們說回來,為什么叫“窗口”函數呢?這是因為partition by分組后的結果稱為“窗口”,這里的窗口不是我們家里的門窗,而是表示“范圍”的意思。

 

 

 

over():開窗函數。

開窗函數就是在查詢的總記錄中使用記錄的一部分進行操作。
在沒有開窗函數時,select子句中如果出現聚合函數,就不能查看具體的記錄信息,只能查看組的信息。開窗函數可以讓我們同時查詢聚合函數和組內記錄。
over的意思是基於什么做運算,over后面表示一個范圍,如果是空括號 over (),表示基於查詢出的所有記錄

案例1:在總記錄中添加統計函數,不需要group by
select name,count(*) over() as 總數 from tb_promocodenew where id<5000
案例2:查看訂單信息,並顯示當前用戶的總訂單金額
select id,UserID,sum(TotalPrice) over (partition by UserID) as 當前用戶總金額 from tb_promocodenew where id<5000;
案例3:行號
select*,ROW_NUMBER() Over(order by ID) as rowId from tb1
案例4:顯示多組行號,按codeClass分組顯示行號:
select name,CodeClass
,sum(CodeValue) over (partition by CodeClass)
,ROW_NUMBER() over (partition by codeClass order by name) 
from tb_promocodenew where id<5000;

 

參考:

MySQL窗口函數:https://www.cnblogs.com/DataArt/p/9961676.html

https://www.toutiao.com/i6763168115615334925/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM