1.窗口函数:over
(1)lag()/lead() over()分析函数
lag函数是按id倒序排序把上一行的age记录显示在当前行的列lag,为null显示null;
lead函数是按id倒序排序把下一行的age记录显示在当前行的列lag,为null显示null
(2)排序编号的使用
row_number()/rank()/dense_rank() OVER(PARTITION BY… ORDER BY…)
(3)聚合函数等的配合使用
sum() ,first_value()、last_value()、count()、min()、max()等。
sum() over()分组求和
first_value() over()求分组第一条
last_value() over()求分组最后一条
(4)其他特殊情况
over(order by salary range between 50 preceding and 150 following)
每行对应的数据窗口是之前行幅度值不超过50,之后行幅度值不超过150
over(order by salary rows between 50 preceding and 150 following)
每行对应的数据窗口是之前50行,之后150行
over(order by salary rows between unbounded preceding and unbounded following)
每行对应的数据窗口是从第一行到最后一行,等效:
over(order by salary range between unbounded preceding and unbounded following)
2.group by rollup(a,b):分组三次
第一次,a,b两个约束条件,即a相同,b也相同的分为同一组;
第二次,只是用a一个条件进行分组,把上一次形成的结果在进行分组,把a相同的分为一组;
第三次,没有约束条件,将整个表数据分为一组
这样三次之后,我们就有了三个分组条件,那么sum函数,就会给每一个分组都执行一次计算总和。
如:group by rollup(group_id) ,按照小组进行分组,同时求总计
GROUPING函数:如果显示“1”表示GROUPING函数对应的列(例如JOB字段)是由于ROLLUP函数所产生的空值
对应的信息,即对此列进行汇总计算后的结果。如果显示“0”表示此行对应的这列参未与ROLLUP函数分组汇总活动。
3.行转列 pivot函数
select * from (temp)
pivot(max(DETAIL_ADDRESS)
for dr in(1 as “ADDRESS_1”, 2 as “ADDRESS_2”, 3 as “ADDRESS_3”))
4.列转行 UNPIVOT函数
select * from aaa
pivot (sum(er) for th in (‘COL_1’ as 第一列,'COL_2’as 第二列 ,‘COL_3’ as 第三列))
unpivot ( aa for bb in(第一列,第二列,第三列));