天天看點

Hive 視窗函數(開窗函數) overOVER函數

文章目錄

  • OVER函數
    • 1.含義:
    • 2.示例:

OVER函數

1.含義:

視窗函數主要解決 分析整體資料時,多個資料和一個結果對應,為每一條資料開啟指定行範圍的視窗;

over() 指定 分析函數 工作時的資料視窗大小,這個視窗大小可能會随行的改變而改變;

用于between … and … 表示範圍概念:

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開始,對于每一行,NTILE傳回此行所屬的組的編号。注意:n必須為int類型。

常用格式:

over() 會為每條資料開啟一個視窗,預設的視窗大小就是目前資料集的大小

over(partition by 字段) 會按照指定的字段進行分區,把分區字段值相同的資料劃分到同一個分區;分區中每條資料開啟一個視窗,每條資料的預設的視窗大小就是目前分區資料集的大小

over(order by 字段) 會在視窗中按照指定的字段對資料進行排序;會為每條資料開啟一個視窗,預設的視窗大小為從資料集開始UNBOUNDED PRECEDING到目前行CURRENT ROW

over(partition by 字段 order by 字段) 會按照指定的字段進行分區,把分區字段值相同的資料劃分到同一個分區,會在每個分區中按照指定的字段進行排序;分區中每條資料開啟一個視窗,每條資料的預設的視窗大小就是目前分區從資料集開始UNBOUNDED PRECEDING到目前行CURRENT ROW

over(partition by 字段 order by 字段 rows between … and …) 會按照指定的字段進行分區,把分區字段值相同的資料劃分到同一個分區,會在每個分區中按照指定的字段進行排序;分區中每條資料開啟一個視窗,每條資料的視窗大小為指定的視窗大小

2.示例:

business 表資料:

Hive 視窗函數(開窗函數) overOVER函數

(1)查詢在2017年4月份購買過的顧客及總人數

select name,count(*) over () 
from business 
where substring(orderdate,1,7) = '2017-04' 
group by name;
           
Hive 視窗函數(開窗函數) overOVER函數

(2)查詢顧客的購買明細及每個月所有顧客月購買總額

select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from
business;
           
Hive 視窗函數(開窗函數) overOVER函數

查詢顧客的購買明細及每個顧客月購買總額

Hive 視窗函數(開窗函數) overOVER函數

(3)将每個顧客的cost按照日期進行累加

select name,orderdate,cost, 
sum(cost) over() as sample1,--所有行相加 
sum(cost) over(partition by name) as sample2,--按name分組,組内資料相加 
sum(cost) over(partition by name order by orderdate) as sample3,--按name分組,組内資料累加 
sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) as sample4 ,--和sample3一樣,由起點到目前行的聚合 
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and current row) as sample5, --目前行和前面一行做聚合 
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING AND 1 FOLLOWING ) as sample6,--目前行和前邊一行及後面一行 
sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 --目前行及後面所有行 
from business;

           
Hive 視窗函數(開窗函數) overOVER函數

(4)檢視顧客上次的購買時間以及下一次的購買時間

select name,orderdate,cost, 
lag(orderdate,1,'1900-01-01') over(partition by name order by orderdate ) as time1, lag(orderdate,2) over (partition by name order by orderdate) as time2 
from business;
           
Hive 視窗函數(開窗函數) overOVER函數

(5)查詢前20%時間的訂單資訊

select * from (
    select name,orderdate,cost, ntile(5) over(order by orderdate) sorted
    from business
) t
where sorted = 1;
           
Hive 視窗函數(開窗函數) overOVER函數

繼續閱讀