1. 程式人生 > 其它 >【Leetcode】SQL視窗函式

【Leetcode】SQL視窗函式

技術標籤:Leetcode資料庫mysql

1. 簡單介紹

  • 概念:視窗函式,也叫OLAP函式(Online Anallytical Processing,聯機分析處理),可以對資料庫資料進行實時分析處理。視窗函式作用於一個數據行集合

  • 型別:
    (1) 專用視窗函式,包括後面要講到的rank, dense_rank, row_number等專用視窗函式。
    (2) 聚合函式,如sum. avg, count, max, min等

2. 應用場景

每組內的排名問題、Top N問題,直接用GROUP BY會聚合成一行。視窗函式不減少原表的行數。

3. 例子

  1. 組內排名:先分組partition by,排名依據order by
SELECT *, 
rank() over (partition by 班級
ORDER BY 成績 DESC) AS ranking
FROM 班級表
  • partition by分組後的結果稱為“視窗”。
<視窗函式> over (partition by <用於分組的列名>                order by <用於排序的列名>)
  1. 三種rank
  • rank 並列名次佔用下一名次的位置,5558
  • dense_rank 並列名詞不佔用下一名次的位置,5556
  • row_number 按照行數增加,5678
  1. 聚合函式作為視窗函式
  • 求和、平均、計數、最大最小值,都是針對自身記錄、以及自身記錄之上的所有資料進行計算得到結果

  • 作用:可以在每一行的資料裡直觀的看到,截止到本行資料,統計資料是多少(最大值、最小值等)。同時可以看出每一行資料,對整體統計資料的影響。

  • partition子句可省略,省略就是不指定分組,只排序。

4. 業務向的SQL題:查詢使用者最長連續登入天數

  1. 對使用者ID做分組,組內按登入時間正序,用視窗函式加row number
  2. 做差,日期-行數,同一組內若差一致則表示日期前後連續,按照差的大小分組,計算組內行數即為連續天數
  3. 選出各個使用者ID裡最長的連續天數
SELECT UID, MAX(continuous_days)
FROM 
(SELECT UID, 
date_sub(date1 -
sort) AS login_group, MIN(date1) AS start_date, MAX(date1) AS end_date, COUNT(*) AS continuous_days FROM (SELECT UID, date1, ROW_NUMBER() OVER (PARTITION by UID ORDER BY date1) AS sort FROM user_login) GROUP BY UID, login_group) GROUP BY UID

(寫於電話面試被問到視窗函式後啞口無言的這一天,我該怎麼告訴面試官現在我好像會寫視窗函數了呢qwq)

【參考部落格】
1.https://blog.csdn.net/ganghaodream/article/details/100083543
2.https://zhuanlan.zhihu.com/p/92654574