【Leetcode】SQL視窗函式
阿新 • • 發佈:2021-01-19
1. 簡單介紹
-
概念:視窗函式,也叫OLAP函式(Online Anallytical Processing,聯機分析處理),可以對資料庫資料進行實時分析處理。視窗函式作用於一個數據行集合。
-
型別:
(1) 專用視窗函式,包括後面要講到的rank, dense_rank, row_number等專用視窗函式。
(2) 聚合函式,如sum. avg, count, max, min等
2. 應用場景
每組內的排名問題、Top N問題,直接用GROUP BY會聚合成一行。視窗函式不減少原表的行數。
3. 例子
- 組內排名:先分組partition by,排名依據order by
SELECT *,
rank() over (partition by 班級
ORDER BY 成績 DESC) AS ranking
FROM 班級表
- partition by分組後的結果稱為“視窗”。
<視窗函式> over (partition by <用於分組的列名> order by <用於排序的列名>)
- 三種rank
- rank 並列名次佔用下一名次的位置,5558
- dense_rank 並列名詞不佔用下一名次的位置,5556
- row_number 按照行數增加,5678
- 聚合函式作為視窗函式
-
求和、平均、計數、最大最小值,都是針對自身記錄、以及自身記錄之上的所有資料進行計算得到結果
-
作用:可以在每一行的資料裡直觀的看到,截止到本行資料,統計資料是多少(最大值、最小值等)。同時可以看出每一行資料,對整體統計資料的影響。
-
partition子句可省略,省略就是不指定分組,只排序。
4. 業務向的SQL題:查詢使用者最長連續登入天數
- 對使用者ID做分組,組內按登入時間正序,用視窗函式加row number
- 做差,日期-行數,同一組內若差一致則表示日期前後連續,按照差的大小分組,計算組內行數即為連續天數
- 選出各個使用者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