数据分析(SQL)常见面试题:开窗函数
一、什么是開窗函數
? ? ? ?開窗函數/分析函數:over()
? ? ? ?開窗函數也叫分析函數,有兩類:一類是聚合開窗函數,一類是排序開窗函數。
開窗函數的調用格式為:
函數名(列名) OVER(partition by 列名 order by列名)
? ? ? ?如果你沒聽說過開窗函數,看到上面開窗函數的調用方法,你可能還會有些疑惑。但只要你了解聚合函數,那么理解開窗函數就非常容易了。
? ? ? ?我們知道聚合函數對一組值執行計算并返回單一的值,如sum(),count(),max(),min(), avg()等,這些函數常與group by子句連用。除了 COUNT 以外,聚合函數忽略空值。
? ? ? ?但有時候一組數據只返回一組值是不能滿足需求的,如我們經常想知道各個地區的前幾名、各個班或各個學科的前幾名。這時候需要每一組返回多個值。用開窗函數解決這類問題非常方便。
? ? ? ?開窗函數和聚合函數的區別如下:
? ? ? ?(1)SQL 標準允許將所有聚合函數用作開窗函數,用OVER 關鍵字區分開窗函數和聚合函數。
? ? ? ?(2)聚合函數每組只返回一個值,開窗函數每組可返回多個值。
注:常見主流數據庫目前都支持開窗函數,但mysql數據庫目前還不支持。
二、常見面試題
? ? ? ?1. 分區排序:row_number () over()
有如下學生成績表:students_grades
? ? ? ?查詢每門課程course_name前三名的學生姓名及成績,要求輸出列格式如下:
course_name, number, stu_name, grades
查詢語句如下:
2.幾個排序函數row_number() over()、rank() over()、dense_rank() over()、ntile() over()的區別
(1) row_number() over():對相等的值不進行區分,相等的值對應的排名相同,序號從1到n連續。
(2) rank() over():相等的值排名相同,但若有相等的值,則序號從1到n不連續。如果有兩個人都排在第3名,則沒有第4名。
(3) dense_rank() over():對相等的值排名相同,但序號從1到n連續。如果有兩個人都排在第一名,則排在第2名(假設僅有1個第二名)的人是第3個人。
(4) ntile( n ) over():可以看作是把有序的數據集合平均分配到指定的數量n的桶中,將桶號分配給每一行,排序對應的數字為桶號。如果不能平均分配,則較小桶號的桶分配額外的行,并且各個桶中能放的數據條數最多相差1。
學生成績表同上,查詢語句如下:
查詢結果如下:
原博客原址:https://www.douban.com/group/topic/155112949/
總結
以上是生活随笔為你收集整理的数据分析(SQL)常见面试题:开窗函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的Go+语言初体验——(1)超详细安装
- 下一篇: 【OpenCV 例程200篇】94. 算