SQL/HQL中開窗函式詳細講解
阿新 • • 發佈:2019-02-06
一、前言
本文將從一道面試題入手,以一種易人理解的方式,將對SQL視窗函式部分進行詳細講解。
開窗函式,顧名思義,就是從現有的表上,額外多加一列出來展示,這也是從視覺上來講最直觀的體驗。
二、思維拓展
注:MYSQL中無開窗函式
開窗函式分為兩大類:
1、分組聚合開窗函式
例. sum() over(partition by ... ) 分組聚合,無order by
2、分組排序開窗函式(具體不同將在另一篇博文中詳細說明)
例.rank() over (partition by ... order by ...)
dense_rank() over (partition by ... order by ...)
row_number() over (partition by ... order by ...)
三、面試題
從以下格式的表中,篩選出每日每個URL訪問的第三個使用者
元資料格式:URL USER TIME(時間戳)
四、實現
1、time時間戳轉換成時間
2、擷取轉換後的time的yyyy-mm-dd(substr或left實現)
3、獲取當前日期,轉換成時間,擷取yyyy-mm-dd
4、第一個查詢查詢當天的所有url、user、time通過where 轉換後的時間戳日期 = 當前的時間戳日期
5、使用分組排序開窗函式,獲得url、使用者。where 排名為3條件
程式碼部分(由於同一天中可能會有使用者在同一時間同時進行訪問):
select url,user (select user,url, dense_rank() over(partition by url order by time asc) as rank from (select url,user,time FROM a where substr(from_unixtime(time),0,10)=substr(from_unixtime(unix_timestamp()),0,10))Current_data ) // ---每天時間 where rank = 3