1. 程式人生 > >開窗函式over(partition by .. [order by ..])用法

開窗函式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 ;


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用法相同,只是偏移順序相反。