Oracle_SQL之lag()和lead()函数使用
题目描述首先我们创建一个表 CREATE TABLE user_info(user_id NUMBER(11) primary key,user_name VARCHAR2(14),user_age NUMBER(4),user_birthday DATE);
插入一些数据用于测试,如下: 函数简介
形象的说明如下:
看如下代码: --查询向上偏移 1 位的年龄
SELECT user_id,user_age,lag(user_age,1,0) over(ORDER BY user_id) RESULT FROM user_info;
结果图示:
如下代码: --查询向下偏移 2 位的年龄
SELECT user_id,lead(user_age,2,0) over(ORDER BY user_id) FROM user_info;
结果图示: 在掌握了上面相关的知识之后,我们,可以来试着解决一个 例题描述
结果格式示意图: 求解思路: 但是如何去除相同的部门名称等呢? 我们可以按照部门名称将结果进行分组 然后使用 代码如下: SELECT decode(lag(depttable.department_name,NULL) over(PARTITION BY depttable.department_name ORDER BY emp.department_id ASC),NULL,depttable.department_id,NULL) temp_dep_id,decode(lag(depttable.department_name,depttable.department_name,NULL) temp_dep_name,depttable.employees_num,NULL) temp_emp_num,depttable.avg_salary,NULL) temp_emp_sa,emp.last_name,emp.salary,emp.job_id FROM (SELECT dep1.department_id,dep1.department_name,COUNT(emp1.employee_id) employees_num,round(nvl(AVG(salary),0),2) avg_salary FROM employees emp1,departments dep1 WHERE emp1.department_id(+) = dep1.department_id GROUP BY dep1.department_id,dep1.department_name ORDER BY dep1.department_id) depttable,employees emp WHERE depttable.department_id = emp.department_id ORDER BY emp.department_id ASC,temp_dep_name ASC; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |