接上一篇,這一篇主要介紹三類窗口函數,分布函數、前後函數和頭尾函數。
【分布函數】
PERCENT_RANK基于RANK()函數的排序結果,percent_ranks列按照公式(rank-1) / (rows-1)帶入rank值(row_num列)和rows值,其中,rank為RANK()函數産生的序号,rows為當前窗口的記錄總行數。
SELECT
id,
user_name,
date,
amount,
RANK() OVER w as ranks,
ROUND(PERCENT_RANK() OVER w,2) as percent_ranks
FROM
orders
WINDOW w AS (PARTITION BY user_name ORDER BY amount ASC)
CUME_DIST,分組内小于等于當前rank值的行數/分組内總行數,這個函數比percen_rank使用場景更多。可以用于計算大于等于或小于等于當前訂單金額的訂單比例有多少。
SELECT
id,
user_name,
date,
amount,
RANK() OVER w as ranks,
ROUND(PERCENT_RANK() OVER w,2) as percent_ranks,
ROUND(CUME_DIST() OVER w,2) as cume_dists
FROM
orders
WINDOW w AS (PARTITION BY user_name ORDER BY amount ASC)
【前後函數】
分區中位于當前行前n行(LAG)或後n行(LEAD)的記錄值。這兩個函數在實際中還是有使用場景,比如要查詢上一個訂單距離當前訂單的時間間隔,或者本條訂單距離下一條訂單的時間間隔。
SELECT
id,
user_name,
date,
amount,
LAG(date,1) OVER w as 前一條訂單時間,
LEAD(date,1) OVER w as 後一條訂單時間
FROM
orders
WINDOW w AS (PARTITION BY user_name ORDER BY date ASC)
如果要計算距離上一條訂單的天數,隻需要增加一列,用DATEDIFF函數把兩個日期相減就可以了。如果是第一條訂單,就會返回空值。
SELECT
id,
user_name,
date,
amount,
LAG(date,1) OVER w as 前一條訂單時間,
DATEDIFF(date,LAG(date,1) OVER w) 距離上一天訂單天數
FROM
orders
WINDOW w AS (PARTITION BY user_name ORDER BY date ASC)
【頭尾函數】
頭尾函數FIRST_VAL和LAST_VAL函數,用來得到分區中的第一個或最後一個指定參數的值。可以用來查詢每個用戶第一次和最後一次的訂單數據信息,然後就行比較操作。需要注意的是,最後一條訂單時間是基于當前訂單時間來看的,所有是等于當前訂單時間。
SELECT
id,
user_name,
date,
amount,
first_value(date) OVER w as 第一條訂單時間,
last_value(date) OVER w as 最後一條訂單時間
FROM
orders
WINDOW w AS (PARTITION BY user_name ORDER BY date ASC)
End
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!