over():跟在聚合函式後面,指定分析函式工作的資料視窗大小,決定了資料的聚合範圍,預設範圍是整個資料視窗,即所有行。可使用partition by將資料進行分組聚合;使用order by除了排序(預設asc公升序),還會改變聚合範圍(從開始行到當前行的聚合),使用distribute by…sort by…和partition by…order by…效果一樣。
如下的視窗子句,能對聚合資料進一步的劃分:
current row:當前行
n preceding:往前n行資料
n following:往後n行資料
unbounded:起點,unbounded preceding表示從前面的起點開始,unbounded following表示到後面的終點結束
其他分析函式:
lag(col, n[, default_val]):往前第n行資料
lead(col, n[, default_val]):往後第n行資料
ntile(n):把有序分割槽中的行分發到指定資料的組中,各個組的編號從1開始,一共分成n片。
例子
create table business(name string, orderdate string, cost int);
(1)查詢在2023年1月份購買過的顧客及總人數
select name,count(*) over()
from business
where date_format(orderdate, 'yyyy-mm')='2019-01'
group by name;
注意「總人數」指顧客數量,如果不使用over(),結果將是每位顧客對應的購買次數,此處over()省略視窗字句rows between unbounded preceding and unbounded following,即針對所有行。
(2)查詢顧客的購買明細及月購買總額
select name, orderdate, cost, sum(cost) over(partition by month(orderdate))
from business;
或:select name, orderdate, cost, sum(cost) over(distribute by month(orderdate))
from business;
由於查詢欄位中含有與orderdate無關的字段,故使用不了group by。
(3)查詢顧客購買明細,以及每個顧客的cost按照日期進行累加
select name, orderdate, cost, sum(cost) over(partition by name order by orderdate)
from business;
order by的聚合範圍即從開始行到當前行的聚合,加上視窗語句「rows between unbounded preceding and current row」效果一樣。
(4)查詢顧客上次的購買時間
select name, orderdate, lag(orderdate, 1, '0000-00-00') over(partition by name order by orderdate) last_time
from business;
lag函式如果沒有上n次的值,返回null,或者指定的預設值。
(5)查詢前20%時間的訂單資訊
select name, orderdate, cost from(
select name, orderdate, cost, ntile(5) over(order by orderdate) arr
from business
)where arr = 1;
需要查詢前20%(即1/5)的資料可以使用ntile函式,切成5片資料,再從中取第乙份資料。
rank():相同時排名值會重複,總數不會變,故相同時排名值會跳躍而不連續
row_number():相同時排名值會根據順序計算,不會重複
dense_rank():相同時排名值會重複,總數會減少
例子
create table score(name string, subject string, score int);
計算每門學科成績排名
select name, subject,score,rank()
over(partition by subject order by score desc)
from score;
rank 開窗函式 排序類開窗函式
1,row number over 排序,連續 select score,row number over from sc 按原始 的成績順序進行排序 原始 成績順序 先將分數從大到小排序,分數相同,排名不同 select score,row number over order by score fr...
Hive 開窗函式
普通聚合函式聚合的行集是組,開窗函式聚合的行集是視窗。因此,普通聚合函式每組 group by 只有乙個返回值,而開窗函式則可以為視窗中的每行都返回乙個值。分析函式 如 sum max row number 視窗子句 over函式 over partition by column n order b...
Hive開窗函式
show functions desc function extended upper current row 當前行 n preceding 向前取第n行 n following 向後取第n行 unbounded preceding 首行 unbounded following 尾行 order ...