先用再理解 一個模板解決sql窗口函數問題

簡介

我來說說我這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

這就很具體了,比如

  1. 現有一個公司工資表Salary,我想找到每個部門收入最多的前兩個員工。
  2. 考試成績表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

簡單記錄一下,大家共勉~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章