hive窗口函数_Maxcompute ODPS SQL 窗口函数

ODPS SQL 窗口函数

213d7f801d1d84cab4a4cd9c83213b12.png

1. count():用于计数

-- 准备表
create table if not exists tmp_data3(
    id bigint,
    num double
)
;
-- 插入数据
insert into table tmp_data3
(id,num)
VALUES 
(1,1),
(1,1),
(1,1),
(2,1),
(2,1),
(3,1)
;

8a9b38b2d61d0b6c02ebe4467a6e3f24.png
count()计算前
-- count()窗口函数查询
select  
    id,
    count(num) over (partition by id) as count_num 
from tmp_data3
;

8dd22e6605d7a5861ac430b93c9f85c2.png
count()计算后
-- count()窗口函数查询加上order by 
-- 加上order by 时,返回累计计数值
select  
    id,
    count(num) over (partition by id order by id asc) as count_num 
from tmp_data3
;

818c838b14997f1bd5f2149fb9c2c633.png
count()加上order by

--********************************************************************--

2. AVG():计算平均值

-- 准备表
create table if not exists tmp_data3(
    id bigint,
    num double
)
;
-- 插入数据
insert into table tmp_data3
(id,num)
VALUES 
(1,1.5),
(1,2.0),
(1,3.0),
(2,4.0),
(2,5.0),
(3,6.0)
;
-- 数据查询
select * from tmp_data3;

af5e023629e0b6a8f03fa76bd0bb74c0.png
AVG()计算前
-- AVG()窗口函数查询
select  
    id,
    AVG(num) over (partition by id ) as count_num 
from tmp_data3
;

3b152f47582e7236124e3bcbbd4fbc5c.png
AVG()计算后
-- AVG() 加上 order by
-- 当非Hive兼容时,返回值为各自行的AVG。
set odps.sql.hive.compatible=false;
select  
    id,
    num,
    AVG(num) over (partition by id order by num asc) as count_num 
from tmp_data3
;

4d0ce3251727d049af06f01f0657aa7b.png
非Hive兼容时,AVG()加上order by
-- 当Hive兼容时,返回值为相同值的最后一行的AVG
set odps.sql.hive.compatible=true;
select  
    id,
    num,
    AVG(num) over (partition by id order by num asc) as count_num 
from tmp_data3
;

e61e5fa560a9ab2b8380848dccc894a5.png
当Hive兼容时,AVG()加上order by

--********************************************************************--

3. MAX():用于计算最大值

select  
    id,
    num,
    MAX(num) over (partition by id) as num2 
from tmp_data3
;

c76acadd83a4a6f2dc7a7f87a2288b0a.png
MAX()

--********************************************************************--

4. MIN():用于计算最小值

-- MIN ()
select 
    id,
    num,
 MIN(num) over (partition by id order by num asc) as num2 
from tmp_data3
;

431875c82de03279cfc00274ebcc6361.png
MIN()

--********************************************************************--

5. MEDIAN():用于计算中位数最小值

-- MEDIAN()
select 
    id,
    num,
 MEDIAN(num) over (partition by id) as num2 
from tmp_data3
;

95182f2fa5c41afafec4459fa9998c5a.png
中位数MEDIAN()

--********************************************************************--

6.STDDEV():总体标准差

select 
    id,
    num,
 STDDEV(num) over (partition by id) as num2 
from tmp_data3
;

2424566e1491d1eb5ef3140e9104cac1.png
STDDEV()

--********************************************************************--

7.STDDEV_SAMP():样本标准差

select 
    id,
    num,
 STDDEV_SAMP(num) over (partition by id) as num2 
from tmp_data3
;

6312e654470a147717a8ed994e51cd41.png
STDDEV_SAMP()

--********************************************************************--

8.SUM():用于计算汇总值

select 
    id,
    num,
 SUM(num) over (partition by id) as num2 
from tmp_data3
;

0351844e48f0b0653d3be5c2f355284c.png
SUM()

--********************************************************************--

9.DENSE_RANK():该函数用于计算连续排名。相同的行数据获得的排名相同。

select  
    id,
    num,
    DENSE_RANK() over (partition by id order by num desc) as num2 
from tmp_data3
;

26397f425ee4aa53a95905c7fd7281e4.png
DENSE_RANK

--********************************************************************--

10.RANK():该函数用于计算排名。相同的行数据获得排名顺序下降。

select  
    id,
    num,
    RANK() over (partition by id order by num desc) as num2 
from tmp_data3
;

5e944cf988297b56be7cb9f148e92b77.png
RANK

--********************************************************************--

11.LAG():按偏移量取当前行之前第几行的值。

select  
    id,
    num,
    LAG(num,1,null) over (partition by id order by num desc) as num2 
from tmp_data3
;

ba1c11b9e7420752386edc34f3ae001e.png
LAG

--********************************************************************--

12.LEAD():按偏移量取当前行之后第几行的值。

select  
    id,
    num,
    LEAD(num,1,null) over (partition by id order by num desc) as num2 
from tmp_data3
;

0581c982103fa8bd3090f1169a855340.png
LEAD

--********************************************************************--

13.PERCENT_RANK():该函数用于计算一组数据中某行的相对排名。

select  
    id,
    num,
    PERCENT_RANK() over (partition by id order by num desc) as num2 
from tmp_data3
;

9e2ff9f63c79afaeff6d4e3e9d8cdcd3.png
PERCENT_RANK

--********************************************************************--

14.ROW_NUMBER():该函数用于计算行号,从1开始。

select  
    id,
    num,
    row_number() over (partition by id order by num desc) as num2 
from tmp_data3
;

44b58fe0fb501c8190ff2a1b1fe6fa3b.png
row_number

--********************************************************************--

15.CLUSTER_SAMPLE():该函数用于分组抽样。

select  
    id,
    num,
    cluster_sample(10,1) over (partition by id) as num2 
from tmp_data3
;
-- 从窗口中抽取10%的值,并从每组窗口中抽取1份记录;

02e2ee6ac4a916e18bfb7c0d4d37a81b.png

--********************************************************************--

16.CUME_DIST():求累计分布,相当于求分组中值大于等于当前值的行数占分组总行数的比例。

例子:求自己的工资在同一组内的前百分之几;

select  
    id,
    num,
    cume_dist() over (partition by id order by num asc) as num2 
from tmp_data3
;

a76835e97e15bf6c744d7a015e94a25a.png
cume_dist

--********************************************************************--

17.NTILE():用于将分组数据按照顺序切分成n片,并返回当前切片值。如果切片不均匀,默认增加第一个切片的分布。

例子:计算自己的工资在组内的序号;

-- 准备表
create table if not exists tmp_data3(
    id bigint,
    num double
)
;
-- 插入数据
insert into table tmp_data3
(id,num)
VALUES 
(1,1.5),
(1,1.6),
(1,2.5),
(1,2.5),
(1,3.5),
(2,4.0),
(2,5.0),
(3,6.0),
(3,10.0)
;
-- 查询
select  
    id,
    num,
    ntile(2) over (partition by id order by num asc) as num2 
from tmp_data3
;

ec36dc12b1f9a99a2bfcae61557b392c.png
ntile

--********************************************************************--

18.FIRST_VALUE():用于计算第一个值。

select  
    id,
    num,
    first_value(num) over (partition by id ) as num2 
from tmp_data3
;

9bf2928ad7b22eb86defebd62e7426f4.png
first_value

--********************************************************************--

19.LAST_VALUE():用于计算最后一个值。

select  
    id,
    num,
    LAST_VALUE(num) over (partition by id ) as num2 
from tmp_data3
;

88805da65d42521584744ea2467ed871.png
LAST_VALUE

--********************************************************************--

20.NTH_VALUE():用于计算第n个值。

select  
    id,
    num,
    NTH_VALUE(num,2) over (partition by id order by num desc) as num2 
from tmp_data3
;

a8997ec11d0fd26283951260ab2f3187.png
NTH_VALUE

--********************************************************************--

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值