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

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 ;

开窗函数over(partition by .. [order by ..])用法_第1张图片

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 ;
开窗函数over(partition by .. [order by ..])用法_第2张图片

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 ;
开窗函数over(partition by .. [order by ..])用法_第3张图片

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 ;
开窗函数over(partition by .. [order by ..])用法_第4张图片

select prov_name, city_name, val_cnt,
sum(val_cnt) over(partition by prov_name) AS rst
from test_orer_partition_by ;
开窗函数over(partition by .. [order by ..])用法_第5张图片

select prov_name, city_name, val_cnt,
sum(val_cnt) over() AS rst
from test_orer_partition_by ;
开窗函数over(partition by .. [order by ..])用法_第6张图片

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 ;
开窗函数over(partition by .. [order by ..])用法_第7张图片

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 ;
开窗函数over(partition by .. [order by ..])用法_第8张图片

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

你可能感兴趣的:(IT/数据库)