diff --git "a/03 \350\265\226\345\277\203\345\246\215/20231013 \347\252\227\345\217\243\345\207\275\346\225\260.md" "b/03 \350\265\226\345\277\203\345\246\215/20231013 \347\252\227\345\217\243\345\207\275\346\225\260.md" index 22212b2fe5424aea70986dd13b369da16ab60052..05f37e0395c9e537805c08d9246361b2ab126df0 100644 --- "a/03 \350\265\226\345\277\203\345\246\215/20231013 \347\252\227\345\217\243\345\207\275\346\225\260.md" +++ "b/03 \350\265\226\345\277\203\345\246\215/20231013 \347\252\227\345\217\243\345\207\275\346\225\260.md" @@ -191,66 +191,113 @@ select distinct dname,count(eid) over (partition by dname) from employee; select distinct dname,avg(salary) over (partition by dname) from employee; #求每个部门的工资排名(从高到低,相同工资并列,并执行跳过排序) -select dname,ename,salary,rank() over (order by salary desc) from employee; +select dname,ename,salary,rank() over (partition by dname order by salary desc) 排名 +from employee; #求公司所有员工的年龄排序(相同年龄并列,执行跳过排序) -select ename,birth,datediff(now(),birth) div 365 ,rank() over (order by datediff(now(),birth) div 365 desc) from employee; - +select dname,ename,datediff(now(),birth) div 365, + rank() over (order by datediff(now(),birth) div 365 desc) 排名 +from employee; + #求每个部门的员工工龄排序(相同年龄并列,执行顺序排序) -select ename,hiredate,datediff(now(),hiredate) div 365 ,rank() over (order by datediff(now(),hiredate) div 365 desc) from employee; - +select dname,ename,datediff(now(),hiredate) div 365, + rank() over (partition by dname order by datediff(now(),hiredate) div 365) + 排名 +from employee; + #计算每个员工的工资与该部门平均工资的差额 -select dname,ename,(salary-avg(salary) over (partition by dname)) from employee; - +select dname,ename,salary,salary-avg(salary) over (partition by dname) 差额 from employee; + #按员工工资进行排序,比较相邻两个员工的工资,输出比较高的工资 -select ename,salary,max(salary) over (rows between 1 preceding and 1 following) from employee; - +select ename,salary, + max(salary) over (rows between 1 preceding and 1 following) 较高的工资 +from employee; + #按员工工资进行排序,查询当前员工与前一位和后一位的工资平均值 -select ename,salary,avg(salary) over (rows between 1 preceding and 1 following) from employee; +select dname,ename,salary, + avg(salary) over (rows between 1 preceding and 1 following) 平均值 +from employee; #按员工工资进行排序,查询当前员工至最后一位员工的工资总和 -select ename,sum(salary) over (rows between current row and unbounded following) from employee; +select ename, + sum(salary) over (rows between current row and unbounded following) 总和 +from employee; #计算每个部门内最高薪资与平均薪资的差额 -select distinct dname,max(salary) over (partition by dname)-avg(salary) over (partition by dname) from employee; +select distinct dname, + max(salary) over (partition by dname)-avg(salary) over (partition by dname) + 差额 +from employee; #找出各部门年薪第二高的员工 -select * from (select dname,eid,ename,salary,dense_rank() over (partition by dname order by salary desc) 排序 from employee) a where 排序=2; +select * from + (select dname,salary, + dense_rank() over (partition by dname order by salary desc) 排序 + from employee) a +where 排序=2; #查询各部门中小于等于当前员工实际薪资的比例 -select dname,ename,salary,cume_dist() over (partition by dname order by salary asc) from employee; - +select dname,ename,salary, cume_dist() over (partition by dname order by salary) from employee; + #查询每个员工工资在全部员工中的排名比例 -select ename,salary,cume_dist() over (order by salary) from employee; from employee; +select ename,salary,cume_dist() over (order by salary) from employee; #查询每个部门工资排名在前25%的员工记录数 -select * from (select *,ntile(4) over (partition by dname order by salary desc) a from employee) b where a=1; - +select * from + (select *,ntile(4) over (partition by dname order by salary desc) 工资 + from employee) b +where 工资=1; + #每个部门按年龄进行排序,求当前员工与前一位员工的年龄差 -select dname,ename,birth,datediff(birth,lag(birth) over (partition by dname order by birth)) from employee; +select dname,ename,datediff(now(),birth) div 365 年龄, + (datediff(birth,lag(birth) over (partition by dname order by birth))) div 365 年龄差 +from employee; + #按入职日期进行排序,查询公司每个员工与后面一个员工的入职天数差异 +select dname,ename,datediff(now(),hiredate) div 365 工龄, + (datediff(hiredate,lead(hiredate) over (order by hiredate))) 工龄差 +from employee; #将每个部门的员工按工资平均分为2个组,组1为低工资,组2为高工资 -select dname,ename,salary,ntile(2) over (partition by dname order by salary) from employee; +select dname,ename,salary,ntile(2) over (partition by dname order by salary) 分组 from employee; #将所有员工按照工龄分为4个组,并统计每个组的人数 -select b.a,count(b.a) from (select dname,ename,ntile(4) over (order by birth) a from employee) b group by b.a; - -#将员工按照工资分为3个组,并统计组别,每组平均工资,工资范围(first_value、last_value) -select num,avg(salary),min(salary),max(salary) from (select *,ntile(3) over (order by salary) num from employee) b group by num; - -### -- 非窗口函数 - -#按照工龄区分等级,小于5年为新员工,5-15年为老员工,大于15年为骨灰级员工,输出姓名,部门,工龄,级别 -select ename,dname,hiredate,floor(datediff(curdate(),hiredate)/365),case when floor(datediff(curdate(),hiredate)/365)<5 then '新员工' when floor(datediff(curdate(),hiredate)/365)>15 then '老员工' else '骨灰级员工' end '员工判定' from employee; +select b.a 组 ,count(b.a) 人数 from + (select dname,ename,ntile(4) over (order by hiredate) a from employee) b +group by b.a; + + #将员工按照工资分为3个组,并统计组别,每组平均工资,工资范围(first_value、last_value) +select a 组 ,avg(salary),max(salary),min(salary) from + (select *,ntile(3) over (order by salary) a from employee) b +group by a; + +### -- 非窗口函数 + #按照工龄区分等级,小于5年为新员工,5-15年为老员工,大于15年为骨灰级员工,输出姓名,部门,工龄,级别 +select ename,dname,datediff(now(),hiredate) div 365 工龄, + case when datediff(now(),hiredate) div 365<5 then '新员工' + when datediff(now(),hiredate) div 365>15 then '骨灰级员工' + else '老员工' + end 级别 +from employee; #返回员工的实际年龄,如果小于当前日期则减1岁 -select ename,dname,birth,floor(datediff(curdate(),birth)/365)-case when date_format(curdate(),'%m%d')