row_number over()的使用:
假如我們有這樣一組數據,我們需要求出不同性別的年齡top2的人的信息。這個時候怎么做?
可能我們會首先想到分組,但是分組只能值top1,怎么樣能求出top2,top3呢?這時候我們想如果分組后能夠按照年齡排序然后標出來序號就好了!
id age name sex
1,18,xiaoli,male
2,19,wang,male
3,22,liu,female
4,16,dawei,male
5,30,erbao,male
6,26,xiao,female
7,18,chengua,male
下面就介紹一個非常有用的函數:row_number() over()他的作用就是分組排序加上序號標記
比如以上求解不同性別的年齡top2,我們可以這樣做:
建表導入數據:
create table rownumber(id string,age int,name string,sex string)
row format delimited
fields terminated by ',';
load data local inpath '/root/mytest/rowover.dat' into table rownumber;
select id,age,name,sex,
row_number() over(partition by sex order by age desc) as rownumber
from rownumber;
我們可以清楚的看到 row_number() over(partition by sex order by age desc) as rownumber
就相當於增加了一列序號,over()中partition by sex是按照sex分組,order by age desc按照年齡降序排序,然后row_number()在加上序號。
select id,age,name,sex
from
(select id,age,name,sex,
row_number() over(partition by sex order by age desc) as rownumber
from rownumber ) temp
where rownumber<3;
這樣就求出分組topn了,很方便!
sum() over()的使用:
有這樣的數據:第一列name,第二列月份mon,第三列金額jine
A,2015-01,5
A,2015-01,15
B,2015-01,5
A,2015-01,8
B,2015-01,25
A,2015-01,5
C,2015-01,10
C,2015-01,20
A,2015-02,4
A,2015-02,6
C,2015-02,30
C,2015-02,10
B,2015-02,10
B,2015-02,5
A,2015-03,14
A,2015-03,6
B,2015-03,20
B,2015-03,25
C,2015-03,10
C,2015-03,20
我們需要求出對於每個人的一個月的總額和累計到當前月的總額。
傳統方法非常的麻煩,具體思路是;先求出月總額表(name,mon,amount),然后講月總額表自聯結,在過濾當前月份后面的月份,最終在求和。
使用sum() over()可以輕松給解決,sum()首先我們都知道是求和,加上over()就是針對某個窗口求和了,具體哪個窗口呢?
具體實現:
求出每月的總額 放到表中,先將數據加載到表中,在求月總額
create table monsum(name string,mon string,jine string)
row format delimited
fields terminated by ',';
load data local inpath '/root/mytest/sumreport.dat' into table monsum;
--求出月總額
create table monamount
as
select name,mon,sum(jine) as amount
from monsum
group by name,mon;
然后使用窗口函數求出累計當前月總額,
select name,mon,amount,
sum(amount) over(partition by name order by mon rows between unbounded preceding and current row) as account
from monamount;
sum(amount)的求和是針對后面over()窗口的求和,
over中partition by name order by mon 針對name這一組按照月份排序,rows between unbounded preceding and current 限定了行是按照在當前行不限定的往前處理,通俗就是處理當前以及之前的所有行的sum,即3月時sum(amount)求的時123月的和,2月時sum(amount)求的是12月的和。unbounded意思無限的 preceding在之前的,current row當前行。