sql学习,刷题3

创建一个actor表,包含如下列信息
在这里插入图片描述

create table if not exists actor (
    actor_id smallint(5) not null primary key COMMENT'主键id',
    first_name varchar(45) not null COMMENT'名字',
    last_name varchar(45) not null COMMENT '姓氏',
    last_update date not null COMMENT '日期' 
)

牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分。
有一个用户表(user),简况如下:
在这里插入图片描述
还有一个积分表(grade_info),简况如下:
在这里插入图片描述
第1行表示,user_id为1的用户积分增加了3分。
第2行表示,user_id为2的用户积分增加了3分。
第3行表示,user_id为1的用户积分又增加了1分。

最后1行表示,user_id为5的用户积分增加了3分。
请你写一个SQL查找积分增加最高的用户的名字,以及他的总积分是多少(此题数据保证积分最高的用户有且只有1个),以上例子查询结果如下:
在这里插入图片描述
直接SUM聚合,再GROUP BY 按u.id分组排列多香,不一定非得用子查询啊

SELECT 
    u.name,
    SUM(grade_num) AS grade_sum
FROM user u
JOIN grade_info g
ON u.id =g.user_id
GROUP BY u.id
order by grade_sum desc
limit 0,1;

(倒序排列,取第一个即为最大分数)
select name,s grade_sum
from
(select name,user_id,sum(grade_num) s
from user,grade_info
where id = user_id
group by user_id) a
order by s desc
limit 0,1

有一个部门表departments简况如下:
在这里插入图片描述
有一个,部门员工关系表dept_emp简况如下:
在这里插入图片描述
有一个薪水表salaries简况如下:
在这里插入图片描述
请你统计各个部门的工资记录数,给出部门编码dept_no、部门名称dept_name以及部门在salaries表里面有多少条记录sum,按照dept_no升序排序,以上例子输出如下:
在这里插入图片描述
每个部门分组,并分别统计工资记录总数,思路如下:

1、用INNER
JOIN连接dept_emp表和salaries表,并以dept_emp.no分组,统计每个部门所有员工工资的记录总数

2、再将上表用INNER
JOIN连接departments表,限制条件为两表的dept_no相等,找到dept_no与dept_name的对应关系,最后依次输出dept_no、dept_name、sum

SELECT de.dept_no, dp.dept_name, COUNT(s.salary) AS sum 
FROM (dept_emp AS de INNER JOIN salaries AS s ON de.emp_no = s.emp_no) 
INNER JOIN departments AS dp ON de.dept_no = dp.dept_no 
GROUP BY de.dept_no
order by de.dept_no

select 
    dm.dept_no,dm.dept_name,count(*) sum
from 
    departments dm,dept_emp de,salaries s
where
    dm.dept_no=de.dept_no
and 
    de.emp_no=s.emp_no
group by 
    dm.dept_no

	


牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分。
有一个用户表(user),简况如下
在这里插入图片描述
还有一个积分表(grade_info),简况如下:
在这里插入图片描述
第1行表示,user_id为1的用户积分增加了3分。
第2行表示,user_id为2的用户积分增加了3分。
第3行表示,user_id为1的用户积分又增加了1分。

最后1行表示,user_id为3的用户积分增加了1分。
请你写一个SQL查找积分增加最高的用户的id(可能有多个),名字,以及他的总积分是多少,查询结果按照id升序排序,以上例子查询结果如下
在这里插入图片描述

select u.id,u.name,sum(g.grade_num) grade_sum
from user u 
join grade_info g
on u.id=g.user_id
group by u.id
having grade_sum = (select sum(grade_num) r 
                    from grade_info g1 
                    group by user_id 
                    order by r desc 
                    limit 1)
select
    u.id,u.name,tmp.num
from
    (select
        *,sum(grade_num) as num, dense_rank() over(order by sum(grade_num) DESC) as r
    from
        grade_info
    group by
        user_id) tmp,
    user u
where
    tmp.r=1
and
    u.id=tmp.user_id
order by
    u.id

客每天有很多人登录,请你统计一下牛客每个用户刷题情况,包括: 用户的名字,以及截止到某天,累计总共通过了多少题。 不存在没有登录却刷题的情况,但存在登录了没刷题的情况,不会存在刷题表里面,会存在提交代码没有通过的情况并记录在刷题表里,通过数目是0。
有登录(login)记录表,简况如下
在这里插入图片描述
第1行表示user_id为2的用户在2020-10-12使用了客户端id为1的设备登录了牛客网

第5行表示user_id为3的用户在2020-10-13使用了客户端id为2的设备登录了牛客网
有刷题(passing_number)表,简况如下
在这里插入图片描述
第1行表示user_id为2的用户在2020-10-12通过了4个题目。

第3行表示user_id为1的用户在2020-10-13提交了代码但是没有通过任何题目。
第4行表示user_id为3的用户在2020-10-13通过了2个题目
有用户(user)表,注:这里id字段对应user_id,简况如下
在这里插入图片描述
本题不需要使用到第一个login表,采用sum函数进行开窗处理,将user_id进行分区,再通过时间升序排序,进而实现了在每个user_id分区中以升序日期排序的通过题数的逐个递加(在这一步中,user_id的排序不重要,date的排序才重要),即“截止到某天,累计总共通过了多少题”的题意

select
name as u_n,date,
sum(number) over(partition by user_id order by date) as ps_num
from passing_number p
left join user u
on p.user_id=u.id
order by date,u_n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值