牛客网SQL 18:
image.png
image.png
请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成,以上例子输出为:
image.png
在不能使用order by的条件下如何选出第二大的值?
嵌套一层查询,去除最大的值,查询第二大的值
第一步: 查出原表最高工资
第二步: 查出除了原表最高工资以外的最高工资(第二高工资)
第三步: 将第二高工资作为查询条件
select e.emp_no,s.salary,e.last_name,e.first_name
from employees e join salaries s on e.emp_no = s.emp_no
where s.salary = --第三步: 将第二高工资作为查询条件
(select MAX(salary) --第二步: 查出除了原表最高工资以外的最高工资(第二高工资)
from salaries
where salary <
(select MAX(salary) from salaries --第一步: 查出原表最高工资
where to_date = '9999-01-01'
)
AND to_date = '9999-01-01'
)
AND s.to_date = '9999-01-01'
牛客网SQL 60:
统计salary的累计和running_total
按照salary的累计和running_total,其中running_total为前N个当前( to_date = '9999-01-01')员工的salary累计和,其他以此类推。 具体结果如下Demo展示。。
CREATE TABLE `salaries` ( `emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
image.png
在同一行求累计数,可使用聚集函数作为窗口函数
解答如下:
select emp_no,salary,
sum(salary) over(order by emp_no) as running_total
from salaries
where to_date = '9999-01-01'
牛客网SQL 61:
对于employees表中,给出奇数行的first_name
解题要点:
1.奇数行--首先排序,再rank % 2 = 1
2.一次查询无法只查出一列,可考虑自连接一个嵌套查询
解答如下:
select e.first_name
from employees e join (
select first_name ,rank() over (order by first_name asc) rank
from employees
) f
on e.first_name = f.first_name
where rank % 2 = 1