1. 程式人生 > >SQL/HQL中開窗函式詳細講解

SQL/HQL中開窗函式詳細講解

一、前言

本文將從一道面試題入手,以一種易人理解的方式,將對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