SQL刷题第四天 牛客

题一:每个人最近的登录日期

牛客每天有很多人登录,请你统计一下牛客每个用户最近登录是哪一天。

有一个登录(login)记录表,简况如下:

iduser_idclient_iddate

1

2

3

4

2

3

2

3

1

2

2

2

2020-10-12

2020-10-12

2020-10-13

2020-10-13


第1行表示user_id为2的用户在2020-10-12使用了客户端id为1的设备登录了牛客网
。。。
第4行表示user_id为3的用户在2020-10-13使用了客户端id为2的设备登录了牛客网

请你写出一个sql语句查询每个用户最近一天登录的日子,并且按照user_id升序排序,上面的例子查询结果如下:

user_idid

2

3

2020-10-13

2020-10-13

查询结果表明:
user_id为2的最近的登录日期在2020-10-13
user_id为3的最近的登录日期也是2020-10-13

 方法(分组+升序排序):

select user_id,Max(date) as id
from  login 
group by user_id 
order by user_id asc

题二:考试分数

牛客每次考试完,都会有一个成绩表(grade),如下:

idjobscore
1C++11001
2C++10000
3C++9000
4Java12000
5Java13000
6JS12000
7JS11000
8JS9999

第1行表示用户id为1的用户选择了C++岗位并且考了11001分

。。。

第8行表示用户id为8的用户选择了JS岗位并且考了9999分

请你写一个sql语句查询各个岗位分数的平均数,并且按照分数降序排序,结果保留小数点后面3位(3位之后四舍五入):

jobavg
Java12500.000
JS10999.667
C++10000.333

(注意: sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才会得到0.5,sqlite四舍五入的函数为round)

方法(Round取小数点后三位,avg取平均值):

select job,ROUND(avg(score),3) as 'avg' from grade
group by job
order by avg desc

题三:查找入职员工时间排名倒数第三的员工所有信息

有一个员工employees表简况如下:

emp_nobirth_datefirst_namelast_namegenderhire_date
100011953-09-02GeorgiFacelloM1986-06-26
100021964-06-02BezalelSimmelF1985-11-21
100031959-12-03PartoBamfordM1986-08-28
100041954-05-01ChristianKoblickM1986-12-01

请你查找employees里入职员工时间排名倒数第三的员工所有信息,以上例子输出如下:

emp_nobirth_datefirst_namelast_namegenderhire_date
100011953-09-02GeorgiFacelloM1986-06-26

注意:可能会存在同一个日期入职的员工,所以入职员工时间排名倒数第三的员工可能不止一个。

 方法(limit .. offset .. 取第几个,distinct 去重 可能存在倒个排名一样的):

SELECT * 
FROM employees
WHERE hire_date = (
    SELECT DISTINCT hire_date 
    FROM employees
    ORDER BY hire_date DESC       -- 倒序
    LIMIT 1 OFFSET 2              -- 去掉排名倒数第一第二的时间,取倒数第三
);    

题四: 查找所有已经分配部门的员工的last_name和first_name以及dept_no

有一个员工表,employees简况如下:

emp_no birth_date first_name last_name genderhire_date 
100011953-09-02Georgi     Facello    M1986-06-26
100021964-06-02Bezalel    Simmel     F1985-11-21
10003  1959-12-03Parto      Bamford    M1986-08-28
10004  1954-05-01Christian  Koblick    M1986-12-01

有一个部门表,dept_emp简况如下:

emp_nodept_no from_date to_date
10001d0011986-06-269999-01-01
10002d0021989-08-039999-01-01

请你查找所有已经分配部门的员工的last_name和first_name以及dept_no,未分配的部门的员工不显示,以上例子如下:

last_name first_name dept_no
Facello   Georgi     d001
Simmel    Bezalel    d002

方法(左连接+拿出部门号不为空的员工) :

select e.last_name ,e.first_name ,d.dept_no
    from  employees e left join dept_emp d
    on e.emp_no = d.emp_no 
    where d.dept_no is not null

题五:查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t

有一个薪水表,salaries简况如下:

emp_nosalaryfrom_dateto_date
10001601171986-06-261987-06-26
10001

62102

1987-06-261988-06-25
10001660741988-06-251989-06-25
10001665961989-06-251990-06-25
10001669611990-06-251991-06-25
10001710461991-06-251992-06-24
10001743331992-06-241993-06-24
10001752861993-06-241994-06-24
10001759941994-06-241995-06-24
10001768841995-06-241996-06-23
10001800131996-06-231997-06-23
10001810251997-06-231998-06-23
10001810971998-06-231999-06-23
10001849171999-06-232000-06-22
10001851122000-06-222001-06-22
10001850972001-06-222002-06-22
10002725271996-08-031997-08-03

请你查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t,以上例子输出如下:

emp_not
1000116

方法(分组用法考察group by having) :

select emp_no,count(emp_no) from salaries
group by emp_no
having count(emp_no) > 15

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值