创建一个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