专业网站优化服务,网站建设远程教育大学论文,二级备案域名,照片管理网站模板下载也在牛客力扣写了一百来题了#xff0c;个人感觉力扣的SQL题要比牛客的高三档的难度。#xff08;普遍来说#xff09; 1. 牛客SQL热题216#xff1a;统计各个部门的工资记录数
1.1 题目#xff1a;
描述
有一个部门表departments简况如下:
dept_nodept_named001Marke… 也在牛客力扣写了一百来题了个人感觉力扣的SQL题要比牛客的高三档的难度。普遍来说 1. 牛客SQL热题216统计各个部门的工资记录数
1.1 题目
描述
有一个部门表departments简况如下:
dept_nodept_named001Marketingd002Finance
有一个部门员工关系表dept_emp简况如下:
emp_nodept_no from_date to_date10001d0012001-06-229999-01-0110002d0011996-08-039999-01-0110003d0021996-08-039999-01-01
有一个薪水表salaries简况如下:
emp_no salaryfrom_date to_date10001850972001-06-222002-06-2210001889582002-06-229999-01-0110002725271996-08-039999-01-0110003323231996-08-039999-01-01
请你统计各个部门的工资记录数给出部门编码dept_no、部门名称dept_name以及部门在salaries表里面有多少条记录sum按照dept_no升序排序以上例子输出如下:
dept_nodept_namesumd001Marketing3d002Finance1
示例1
输入drop table if exists departments ;
drop table if exists dept_emp ;
drop table if exists salaries ;
CREATE TABLE departments (
dept_no char(4) NOT NULL,
dept_name varchar(40) NOT NULL,
PRIMARY KEY (dept_no));
CREATE TABLE dept_emp (
emp_no int(11) NOT NULL,
dept_no char(4) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
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));
INSERT INTO departments VALUES(d001,Marketing);
INSERT INTO departments VALUES(d002,Finance);
INSERT INTO dept_emp VALUES(10001,d001,2001-06-22,9999-01-01);
INSERT INTO dept_emp VALUES(10002,d001,1996-08-03,9999-01-01);
INSERT INTO dept_emp VALUES(10003,d002,1996-08-03,9999-01-01);
INSERT INTO salaries VALUES(10001,85097,2001-06-22,2002-06-22);
INSERT INTO salaries VALUES(10001,88958,2002-06-22,9999-01-01);
INSERT INTO salaries VALUES(10002,72527,1996-08-03,9999-01-01);
INSERT INTO salaries VALUES(10003,32323,1996-08-03,9999-01-01);
复制输出d001|Marketing|3
d002|Finance|1
1.2 思路
两个join连接。
1.3 题解
select t1.dept_no, dept_name, count(*) sum
from dept_emp t1
join salaries t2
on t1.emp_no t2.emp_no
join departments t3
on t1.dept_no t3.dept_no
group by t1.dept_no
order by dept_no
2. 牛客SQL热题217对所有员工的薪水按照salary降序进行1-N的排名
2.1 题目
描述
有一个薪水表salaries简况如下:
emp_nosalaryfrom_dateto_date10001889582002-06-229999-01-0110002725272001-08-029999-01-0110003433112001-12-019999-01-0110004725272001-12-019999-01-01
对所有员工的薪水按照salary降序先进行1-N的排名如果salary相同再按照emp_no升序排列
emp_nosalaryt_rank10001889581100027252721000472527210003433113
示例1
输入drop table if exists salaries ;
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));
INSERT INTO salaries VALUES(10001,88958,2002-06-22,9999-01-01);
INSERT INTO salaries VALUES(10002,72527,2001-08-02,9999-01-01);
INSERT INTO salaries VALUES(10003,43311,2001-12-01,9999-01-01);
INSERT INTO salaries VALUES(10004,72527,2001-12-01,9999-01-01);
复制输出10001|88958|1
10002|72527|2
10004|72527|2
10003|43311|3
2.2 思路
这不一眼窗口函数么。
2.3 题解
-- 一眼窗口函数太明显了。
select emp_no, salary, dense_rank() over (order by salary desc) ranks
from salaries
order by salary desc, emp_no
3. 牛客SQL热题223使用join查询方式找出没有分类的电影id以及名称
3.1 题目
描述
现有电影信息表film包含以下字段
字段说明film_id电影idtitle电影名称description电影描述信息
有类别表category包含以下字段
字段说明category_id电影分类idname电影分类名称last_update电影分类最后更新时间
电影分类表film_category包含以下字段
字段说明film_id电影idcategory_id电影分类idlast_update电影id和分类id对应关系的最后更新时间
使用join查询方式找出没有分类的电影id以及其电影名称。
示例1
输入drop table if exists film ;
drop table if exists category ;
drop table if exists film_category ;
CREATE TABLE IF NOT EXISTS film (film_id smallint(5) NOT NULL DEFAULT 0,title varchar(255) NOT NULL,description text,PRIMARY KEY (film_id));
CREATE TABLE category (category_id tinyint(3) NOT NULL ,name varchar(25) NOT NULL, last_update timestamp,PRIMARY KEY ( category_id ));
CREATE TABLE film_category (film_id smallint(5) NOT NULL,category_id tinyint(3) NOT NULL, last_update timestamp);
INSERT INTO film VALUES(1,ACADEMY DINOSAUR,A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies);
INSERT INTO film VALUES(2,ACE GOLDFINGER,A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China);
INSERT INTO film VALUES(3,ADAPTATION HOLES,A Astounding Reflection of a Lumberjack And a Car who must Sink a Lumberjack in A Baloon Factory);INSERT INTO category VALUES(1,Action,2006-02-14 20:46:27);
INSERT INTO category VALUES(2,Animation,2006-02-14 20:46:27);
INSERT INTO category VALUES(3,Children,2006-02-14 20:46:27);
INSERT INTO category VALUES(4,Classics,2006-02-14 20:46:27);
INSERT INTO category VALUES(5,Comedy,2006-02-14 20:46:27);
INSERT INTO category VALUES(6,Documentary,2006-02-14 20:46:27);
INSERT INTO category VALUES(7,Drama,2006-02-14 20:46:27);
INSERT INTO category VALUES(8,Family,2006-02-14 20:46:27);
INSERT INTO category VALUES(9,Foreign,2006-02-14 20:46:27);
INSERT INTO category VALUES(10,Games,2006-02-14 20:46:27);
INSERT INTO category VALUES(11,Horror,2006-02-14 20:46:27);INSERT INTO film_category VALUES(1,6,2006-02-14 21:07:09);
INSERT INTO film_category VALUES(2,11,2006-02-14 21:07:09);
复制输出3|ADAPTATION HOLES
3.2 思路
左外连接即可。
3.3 题解
-- 第二张表是蒙人的吧。。。
-- 这不就简单的左外连接吗
select t1.film_id, title
from film t1
left join film_category t2
on t1.film_id t2.film_id
where category_id is null
4. 牛客大厂笔试真题W2最长连续登录天数
4.1 题目
描述
你正在搭建一个用户活跃度的画像其中一个与活跃度相关的特征是“最长连续登录天数” 请用SQL实现“2023年1月1日-2023年1月31日用户最长的连续登录天数”
示例1
输入drop table if exists tb_dau;
create table tb_dau (fdate date,user_id int
);
insert into tb_dau(fdate, user_id)
values
(2023-01-01, 10000),
(2023-01-02, 10000),
(2023-01-04, 10000);
复制输出user_id|max_consec_days
10000|2
复制说明id为10000的用户在1月1日及1月2日连续登录2日1月4日登录1日故最长连续登录天数为2日备注示例如用户在1月3日-1月10日登录且在1月20日-1月22日登录则最长连续登录天数为8MySQL中日期加减的函数日期增加 DATE_ADD例date_add(2023-01-01, interval 1 day) 输出 2023-01-02
日期减少 DATE_SUB例date_add(2023-01-01, interval 1 day) 输出 2022-12-31日期差 DATEDIFF例datediff(2023-02-01, 2023-01-01) 输出31
4.2 思路
一句话两个记录的日期的差值如果等于两记录的排名差值说明中间一直是连续的。
4.3 题解
-- 先给每条记录以排名
with tep1 as (select fdate, user_id, rank() over (partition by user_id order by fdate) ranksfrom tb_dau
), tep2 as (-- 整体是自连接的思想-- on限制user_id相同且diff必须是0或正数-- 最重要的条件是两个记录的日期的差值要等于两记录的排名差值select t1.user_id, datediff(t2.fdate, t1.fdate)1 daysfrom tep1 t1join tep1 t2on t1.user_id t2.user_id and t2.fdate t1.fdate andt2.ranks datediff(t2.fdate, t1.fdate) t1.ranks
)select user_id, max(days) max_consec_days
from tep2
group by user_id
5. 力扣mid题550游戏玩法分析4
5.1 题目
Table: Activity
-----------------------
| Column Name | Type |
-----------------------
| player_id | int |
| device_id | int |
| event_date | date |
| games_played | int |
-----------------------
player_idevent_date是此表的主键具有唯一值的列的组合。
这张表显示了某些游戏的玩家的活动情况。
每一行是一个玩家的记录他在某一天使用某个设备注销之前登录并玩了很多游戏可能是 0。编写解决方案报告在首次登录的第二天再次登录的玩家的 比率四舍五入到小数点后两位。换句话说你需要计算从首次登录日期开始至少连续两天登录的玩家的数量然后除以玩家总数。
结果格式如下所示 示例 1
输入
Activity table:
------------------------------------------------
| player_id | device_id | event_date | games_played |
------------------------------------------------
| 1 | 2 | 2016-03-01 | 5 |
| 1 | 2 | 2016-03-02 | 6 |
| 2 | 3 | 2017-06-25 | 1 |
| 3 | 1 | 2016-03-02 | 0 |
| 3 | 4 | 2018-07-03 | 5 |
------------------------------------------------
输出
-----------
| fraction |
-----------
| 0.33 |
-----------
解释
只有 ID 为 1 的玩家在第一天登录后才重新登录所以答案是 1/3 0.33
5.2 思路
窗口函数给出排名再进行简单的计算即可。
5.3 题解
-- 先给每个人排名
with tep1 as (select player_id , event_date , dense_rank() over (partition by player_id order by event_date) ranksfrom Activity
)
-- 然后在tep1表中将ranks为2的记录与ranks为1的记录的个数想除
-- ranks为1的记录即第一次登录的玩家ranks为2且与第一次登录的天数相-- 差为1的记录是首次登录第二天再次登录的玩家
select round((select count(*) from tep1 t1 where ranks 2 and datediff(event_date , (select event_date from tep1 t2 where ranks 1 and t1.player_id t2.player_id)) 1)
/
(select count(*) from tep1 where ranks 1), 2) fraction
from dual