簡介
我來說說我這blog的題目吧,爲什麼起這個名字。
“先用再理解”:首先我認爲sql這東西不是什麼門檻很高的技能,當然你想寫的好、運行比別人快是需要下不少功夫的。但是我們至少要先用起來,或者是從效率低的寫法開始,慢慢的你會感受到更好的方法的。總之,先用就對了,實踐起來。
“一個模板解決sql窗口函數問題”:都說了要先用起來,那麼咱們就簡單點,先學個模板,嘻嘻。走個捷徑後面理解的會更快地。
然後我們就進入正題了。
窗口函數
窗口函數又叫OLAP函數(online analytical processing),意思是對數據庫數據進行實時分析處理。
對於窗口函數我們一般都遵循如下寫法:
<窗口函數> OVER (partition by <要分組的列名> Order by <要排序的列名>)
現在不是很懂沒關係,往後看。
經典窗口函數
下面這三種函數都可以記爲排序函數:
主要的不同點如下所示:
rank()
對於相同的數據雖然排序一樣,但是會默認站位,依次順延,存在111456這樣的排序情況。
dense_rank()
相同的數據排序相同,但是隻會佔用一個序號位,存在11123456這樣的排序情況。
row_number()
我簡單的理解爲計算行數,從1開始,即使數據相同但是排序仍然順延。
圖片引用https://zhuanlan.zhihu.com/p/95487133
經典問題
topN
這就很具體了,比如
- 現有一個公司工資表Salary,我想找到每個部門收入最多的前兩個員工。
- 考試成績表grades ,我希望找到每門學科的前十名。
等等等等,類似這樣的問題我們就叫做TopN問題。相信大家也知道了什麼是TopN問題了。
如何解決呢?
介紹一個模板:
select *
from (select *, row_number() over (partition by bumen order by salary ) as rank1
from salary) as tmp
where rank1 <= N
輸出排名問題
當我們已經可以解決TopN問題的時候,這個問題就變得非常簡單了。
無非就是:
select *, rank()/dense_rank()/row_number() over (partition by col1 order by col2 desc) as rankk
from table_dist
簡單記錄一下,大家共勉~~