开窗函数over(partition by .. [order by ..])用法


作者:tang_xuming
来源:CSDN
原文:https://blog.csdn.net/tang_xuming/article/details/79197163
版权声明:本文为博主原创文章,转载请附上博文链接!

1、/** 创建表 /
create table test_orer_partition_by
(
prov_name varchar(20),
city_name varchar(50),
val_cnt int
) ;
2、/
* 插入测试数据 /
insert into test_orer_partition_by values (‘GS’, ‘LZ’, 234) ;
insert into test_orer_partition_by values (‘GS’, ‘BY’, 34) ;
insert into test_orer_partition_by values (‘GS’, ‘DX’, 4) ;
insert into test_orer_partition_by values (‘GS’, ‘LN’, 67) ;
insert into test_orer_partition_by values (‘GS’, ‘GN’, 67) ;
insert into test_orer_partition_by values (‘GS’, ‘QY’, 67) ;
insert into test_orer_partition_by values (‘SX’, ‘XA’, 34) ;
insert into test_orer_partition_by values (‘SX’, ‘YA’, 85) ;
insert into test_orer_partition_by values (‘SX’, ‘BJ’, 254) ;
insert into test_orer_partition_by values (‘SX’, ‘HZ’, 99) ;
insert into test_orer_partition_by values (‘SX’, ‘XY’, 100) ;
insert into test_orer_partition_by values (‘SX’, ‘SL’, 23) ;
3、排序(row_number、rank、dense_rank)
3.1 /
* row_number() over(partition by prov_name ORDER BY val_cnt) */
select prov_name, city_name, val_cnt,
row_number() over(partition by prov_name ORDER BY val_cnt) AS rst
from test_orer_partition_by ;

3.2 /** rank() over(partition by prov_name ORDER BY val_cnt) */
select prov_name, city_name, val_cnt,
rank() over(partition by prov_name) AS rst
from test_orer_partition_by ;

3.3 /** dense_rank() over(partition by prov_name ORDER BY val_cnt) */
select prov_name, city_name, val_cnt,
dense_rank() over(partition by prov_name ORDER BY val_cnt) AS rst
from test_orer_partition_by ;

4、聚合函数(sum、avg、count、max、min、first_value、last_value)
/** sum() over([partition by prov_name [ORDER BY val_cnt]]) */
有order by;按照排序连续累加;无order by,计算partition by后的和;over()中没有partition by,计算所有数据总和
select prov_name, city_name, val_cnt,
sum(val_cnt) over(partition by prov_name ORDER BY val_cnt) AS rst
from test_orer_partition_by ;

select prov_name, city_name, val_cnt,
sum(val_cnt) over(partition by prov_name) AS rst
from test_orer_partition_by ;

select prov_name, city_name, val_cnt,
sum(val_cnt) over() AS rst
from test_orer_partition_by ;

vg、count、max、min、first_value、last_value与sum用法一模一样,不在赘述。
5、分许函数(lag、lead)
/** lead() over([partition by prov_name [ORDER BY val_cnt]]) */
lag、lead有三个参数,第一个是表达式或字段,第二个是偏移量,第三个是为控制赋值
select prov_name, city_name, val_cnt,
lead(val_cnt, 1) over(partition BY prov_name ORDER BY val_cnt) AS rst
from test_orer_partition_by ;

select prov_name, city_name, val_cnt,
lead(val_cnt, 2) over(partition BY prov_name ORDER BY val_cnt) AS rst
from test_orer_partition_by ;

lag与lead用法相同,只是偏移顺序相反。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值