leetcode sql(中等)

SQL查询技巧:排名、连续数列与最高薪资
本文介绍了几个SQL查询的实用技巧,包括如何获取数据库中第N高的薪水、使用窗口函数进行分数排名(dense_rank、rank、row_number)、查找连续出现的数字序列,以及找出每个部门工资最高的员工。这些示例展示了SQL在处理复杂数据查询时的灵活性。

目录

177. 第N高的薪水

178. 分数排名

180. 连续出现的数字

184. 部门工资最高的员工

1454. 活跃用户


177. 第N高的薪水

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT

BEGIN

declare m INT;

set m=N-1;

  RETURN (

      # Write your MySQL query statement below.

      select ifnull((select  distinct salary from Employee order by salary desc limit m,1),null)    

  );

END

178. 分数排名

select Score,dense_rank() over(order by score desc ) 'Rank'  from Scores

(

rank()---1,2,2,4,5

排名为相同时记为同一个排名, 并且参与总排序

dense_rank() over (PARTITION BY xx ORDER BY xx [DESC])---1,2,2,3,4

排名相同时记为同一个排名, 并且不参与总排序

row_number() over (over (PARTITION BY xx ORDER BY xx [DESC]))----1,2,3,4,5

排名相同时记为下一个排名

)

180. 连续出现的数字

select distinct num ConsecutiveNums 

from (

select *,

row_number() over (partition by num order by id)  row_num,

row_number() over (order by id)  id2 

from Logs

) t

group by(id2-row_num),num

having count(*)>=3;

184. 部门工资最高的员工

select d.name as department,e.name as employee,e.salary 

from employee e

 join department d on e.departmentid=d.id

where (e.departmentid,e.salary) in

(select departmentid,max(salary) from employee group by departmentid)

1454. 活跃用户

select * from accounts a

where a.id in(

select l1.id from logins l1,logins l2

where l1.id=l2.id and datediff(l2.login_date,l1.login_date) between 0 and 4

group by l1.id,l1.login_date

having count(distinct l2.login_date)=5

)

order by a.id 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值