一、开窗函数的应用
1.排名函数的应用(row_number rank dense_rank)
1)、row_number()---忽略了排名并列的情况
2)、rank()-------考虑了并列的情况,并列第一之后是第三
3)、dense_rank()----考虑了并列的情况,并列第一之后是第二
2.最值、平均值、求和的函数(MAX MIN AVG SUM )
SELECT E.ENAME, --员工姓名
E.DEPTNO,--员工部门
E.SAL,--员工工资
SUM(E.SAL) OVER(PARTITION BY E.DEPTNO) AS WAGE_SUM,--部门员工工资合计
AVG(E.SAL) OVER(PARTITION BY E.DEPTNO) AS WAGE_AVG,--部门员工平均工资
MAX(E.SAL) OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL DESC) AS WAGE_MAX, --部门内的最高工资
MIN(E.SAL) OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL) AS WAGE_MIN --部门内的最低工资
FROM EMPP E;
3.开窗子句
unbounded preceding---组内首行 unbounded following----组内末行
current row----当前行
1 preceding ----组内当前行的前面一行 1 following---组内当前行的后面一行
range ----值比较 rows----行比较
4、frist_value(列名)----取窗内第一行
last_value(列名)------取窗内最后一行
select q.realname,q.groupno,q.age,
first_value(q.age) over(partition by q.groupno order by q.age) age1,
last_value(q.age) over(partition by q.groupno order by q.age) age2
from qqinfo q------当未限定窗口的起始行和结束行时,窗口默认的第一行为组内数据的第一行,结束行为当前行。
5、lag(列名,偏移量)------往上找
lead(列名,偏移量)-----往下找
lag(列名)-----偏移量默认为1
select q.realname,q.groupno,q.age,
lead(q.age) over(partition by q.groupno order by q.age) age1,
lead(q.age,1) over(partition by q.groupno order by q.age) age2,
lead(q.age,2) over(partition by q.groupno order by q.age) age3,
lead(q.age,2,100) over(partition by q.groupno order by q.age) age4
from qqinfo q
二、递归查询(start with)
select * from emp e start with e.empno=7839 connect by prior e.empno=e.mgr;
查询下级员工时:
start with 开始位置条件 connect by prior 下级字段=上级字段