SQL刷题Day3

牛客网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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容