【SQL】进阶学习与题目补充
【SQL】进阶学习与题目练习
- 1. 学习框架
- 2. leetcode日常练习
- Q1 [1097. 游戏玩法分析 V](https://leetcode-cn.com/problems/game-play-analysis-v/)
- Q1.1 题目:
- Q1.2 代码:
- Q1.3 注意:
- Q2 [571. 给定数字的频率查询中位数](https://leetcode-cn.com/problems/find-median-given-frequency-of-numbers/)
- Q2.1 题目:
- Q2.2 代码:
- Q2.3 注意:
- Q3 [569. 员工薪水中位数](https://leetcode-cn.com/problems/median-employee-salary/)
- Q3.1 题目:
- Q3.2 代码:
- Q3.3 注意:
- Q4 [1045. 买下所有产品的客户](https://leetcode-cn.com/problems/customers-who-bought-all-products/)
- Q4.1 题目:
- Q4.2 代码:
- Q4.3 注意:
- Q5 [578. 查询回答率最高的问题](https://leetcode-cn.com/problems/get-highest-answer-rate-question/)
- Q5.1 题目:
- Q5.2 代码:
- Q5.3 注意:
- Q6
- Q6.1 题目:
- Q6.2 代码:
- Q6.3 注意:
- Q3
- Q3.1 题目:
- Q3.2 代码:
- Q3.3 注意:
- Q3
- Q3.1 题目:
- Q3.2 代码:
- Q3.3 注意:
- 2.4
- 2.41 题目:
- 2.42 代码:
- 2.43 注意:
- 3. zhihu进阶题目
1. 学习框架
2. leetcode日常练习
Q1 1097. 游戏玩法分析 V
Q1.1 题目:
我们将玩家的安装日期定义为该玩家的第一个登录日。
我们还将某个日期 X 的第 1 天留存时间定义为安装日期为 X 的玩家的数量,他们在 X 之后的一天重新登录,除以安装日期为 X 的玩家的数量,四舍五入到小数点后两位。
编写一个 SQL 查询,报告每个安装日期、当天安装游戏的玩家数量和第一天的留存时间。
查询结果格式如下所示:
Activity 表:
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-01 | 0 |
3 | 4 | 2016-07-03 | 5 |
Result 表:
install_dt | installs | Day1_retention |
---|---|---|
2016-03-01 | 2 | 0.50 |
2017-06-25 | 1 | 0.00 |
玩家 1 和 3 在 2016-03-01 安装了游戏,但只有玩家 1 在 2016-03-02 重新登录,所以 2016-03-01 的第一天留存时间是 1/2=0.50;
玩家 2 在 2017-06-25 安装了游戏,但在 2017-06-26 没有重新登录,因此 2017-06-25 的第一天留存时间为 0/1=0.00
Q1.2 代码:
select a1.install_dt,count(*) installs,round(count(a2.event_date) /count(*),2) Day1_retention
from
(select player_id,min(event_date) install_dt
from Activity
group by Activity.player_id
) a1
left join Activity a2
on a1.player_id=a2.player_id
and datediff(event_date,install_dt)=1
group by install_dt
Q1.3 注意:
连接后的表,player_id为主键,使用左连接,第三列显示1天之后有登陆记录的信息
player_id | install_dt | event_date_Day1_retention |
---|---|---|
1 | 2016-03-01 | 2016-03-02 |
Q2 571. 给定数字的频率查询中位数
Q2.1 题目:
Numbers 表保存数字的值及其频率。
Number | Frequency |
---|---|
0 | 7 |
1 | 1 |
2 | 3 |
3 | 1 |
在此表中,数字为 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3,所以中位数是 (0 + 0) / 2 = 0。
median |
---|
0.0000 |
请编写一个查询来查找所有数字的中位数并将结果命名为 median 。
Q2.2 代码:
select avg(a1.Number) median
from
(select Number,sum(Frequency) over(order by Number asc) asc_accumula,sum(Frequency) over(order by Number desc) desc_accumula
from Numbers) a1
where asc_accumula>=(select sum(frequency) from Numbers)/2
and desc_accumula>=(select sum(frequency) from Numbers)/2
Q2.3 注意:
sum(Frequency) over(order by Number desc) desc_accumula, order by 的是Number而不是Frequency
当某一数字的 正序和逆序累计 均大于 整个序列的数字个数的一半 时即为中位数, 将最后选定的一个或两个中位数进行求均值即可。
Q3 569. 员工薪水中位数
Q3.1 题目:
Employee 表包含所有员工。Employee 表有三列:员工Id,公司名和薪水。
Id | Company | Salary |
---|---|---|
1 | A | 2341 |
2 | A | 341 |
3 | A | 15 |
4 | A | 15314 |
5 | A | 451 |
6 | A | 513 |
7 | B | 15 |
8 | B | 13 |
9 | B | 1154 |
10 | B | 1345 |
11 | B | 1221 |
12 | B | 234 |
13 | C | 2345 |
14 | C | 2645 |
15 | C | 2645 |
16 | C | 2652 |
17 | C | 65 |
请编写SQL查询来查找每个公司的薪水中位数。挑战点:你是否可以在不使用任何内置的SQL函数的情况下解决此问题。
Id | Company | Salary |
---|---|---|
5 | A | 451 |
6 | A | 513 |
12 | B | 234 |
9 | B | 1154 |
14 | C | 2645 |
Q3.2 代码:
# Write your MySQL query statement belowselect a1.Id,a1.Company,Salary
from
(
select Id,Company,Salary,
row_number() over (partition by Company order by Salary asc) salary_rnk,
count(*) over (partition by Company ) emply_count
from Employee
) a1
where salary_rnk=emply_count/2
or salary_rnk=emply_count/2 + 1
or salary_rnk=emply_count/2 + 0.5
Q3.3 注意:
where salary_rnk=emply_count/2 or salary_rnk=emply_count/2 + 1 or salary_rnk=emply_count/2 + 0.5
count 和 sum可以同时用
Q4 1045. 买下所有产品的客户
Q4.1 题目:
Customer 表:
Column Name | Type |
---|---|
customer_id | int |
product_key | int |
product_key 是 Customer 表的外键。
Product 表:
Column Name | Type |
---|---|
product_key | int |
product_key 是这张表的主键。
写一条 SQL 查询语句,从 Customer 表中查询购买了 Product 表中所有产品的客户的 id。
示例:
Customer 表:
customer_id | product_key |
---|---|
1 | 5 |
2 | 6 |
3 | 5 |
3 | 6 |
1 | 6 |
Product 表:
product_key |
---|
5 |
6 |
Result 表:
customer_id |
---|
1 |
3 |
购买了所有产品(5 和 6)的客户的 id 是 1 和 3 。
Q4.2 代码:
select customer_id
from Customer
group by customer_id
having count(distinct product_key)=(select count(distinct product_key) from Product)
SELECTA.customer_id
FROMCustomer AS ARIGHT OUTER JOIN Product AS B
ONA.product_key=B.product_key
GROUP BYA.customer_id
HAVINGCOUNT(DISTINCT A.product_key)=(SELECT COUNT(*) FROM Product);
Q4.3 注意:
如果是要找买下指定几样商品的客户呢?直接用count相等的第一种方法不对
Q5 578. 查询回答率最高的问题
Q5.1 题目:
从 survey_log 表中获得回答率最高的问题,survey_log 表包含这些列:id, action, question_id, answer_id, q_num, timestamp。
id 表示用户 id;action 有以下几种值:“show”,“answer”,“skip”;当 action 值为 “answer” 时 answer_id 非空,而 action 值为 “show” 或者 “skip” 时 answer_id 为空;q_num 表示当前会话中问题的编号。
请编写 SQL 查询来找到具有最高回答率的问题。
示例:
输入:
id | action | question_id | answer_id | q_num | timestamp |
---|---|---|---|---|---|
5 | show | 285 | null | 1 | 123 |
5 | answer | 285 | 124124 | 1 | 124 |
5 | show | 369 | null | 2 | 125 |
5 | skip | 369 | null | 2 | 126 |
输出:
survey_log |
---|
285 |
解释:
问题 285 的回答率为 1/1,而问题 369 回答率为 0/1,因此输出 285 。
提示:回答率最高的含义是:同一问题编号中回答数占显示数的比例最高。
Q5.2 代码:
select question_id as survey_log
from
(select question_id,
sum(case when action='show' then 1 else 0 end ) show_num,
sum(case when action='answer' then 1 else 0 end ) answer_num
from survey_log
group by question_id) t1
order by (answer_num/show_num) desc
limit 1
Q5.3 注意:
group by question_id) t1 select * from()后面要给临时表加个名字
Q6
Q6.1 题目:
Q6.2 代码:
Q6.3 注意:
Q3
Q3.1 题目:
Q3.2 代码:
Q3.3 注意:
Q3
Q3.1 题目:
Q3.2 代码:
Q3.3 注意:
2.4
2.41 题目:
2.42 代码:
2.43 注意:
3. zhihu进阶题目
【SQL】进阶学习与题目补充相关推荐
- 【SQL学习笔记】《SQL进阶教程》1.1
SQL进阶教程学习笔记1.1 1-1case 表达式 将已有编号方式转换为新的方式并统计 SELECT CASE pref_nameWHEN '辽宁' THEN '东北'WHEN '福建' THEN ...
- Mysql进阶学习所用到的SQL测试库代码
Mysql进阶学习所用到的SQL测试库代码 一.`myemployees`库 二.`girls`库 一.myemployees库 /* SQLyog Ultimate v10.00 Beta1 MyS ...
- idea中连接mysql插入成功数据 在navicat中刷新表格没有数据_第九篇 数据分析的进阶学习-SQL入门...
1.SQL的学习阶段 1.1 背景 随着互联网的不断发展,数据的不断累积,现在单单使用Excel已经不能满足数据分析的需求了,因此作为一个数据分析工作者,掌握Excel是基础,而SQL作为主流数据库查 ...
- Java学习路线-42:SQL进阶:约束、关系、连接
SQL进阶:约束.关系.连接 课时1 1.单表的查询练习 可视化客户端 SQLyog -- 查询部门编号为30的所有员工 select * from emp where deptno=30;-- 查询 ...
- 【第21天】SQL进阶-查询优化- performance_schema系列三:事件记录(SQL 小虚竹)
回城传送–><32天SQL筑基> 文章目录 零.前言 一.练习题目 二.SQL思路 SQL进阶-查询优化- performance_schema系列三:事件记录 等待事件表 even ...
- SQL训练营学习笔记
学习知识点概要 学习内容 学习问题与解答 学习思考与总结 Task01:初识数据库与SQL 目录 一.初识数据库 1.1 DBMS的种类 1.2 RDBMS的常见系统结构 1.3 数据库安装 1.3. ...
- SQL进阶随笔--case用法(一)
SQL进阶一整个是根据我看了pdf版本的整理以及自己的见解整理.后期也方便我自己查看和复习. CASE 表达式 CASE 表达式是从 SQL-92 标准开始被引入的.可能因为它是相对较新的技术,所以尽 ...
- 【SQL进阶】03.执行计划之旅1 - 初探
听到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. S ...
- SQL进阶,子查询与窗口函数
本节给大家讲解SQL在实际过程中用途比较多的子查询与窗口函数,下面一起学习. 示例工具:MySQL8.0.Navicat Premium 12 本文讲解内容:子查询与窗口函数 适用范围:SQL进阶应用 ...
最新文章
- 如何解决代码中if…else 过多的问题
- 腾讯面经 | 数据从业者的一次“典型”面试
- kali Linux/centos7 Linux设置不会屏保
- PHP 是最糟糕编程语言?
- 0514实训演练 新建项目 使用java编写类与对象 入门
- python 调取百度网盘API,实现上传下载
- Android 模块化编程之引用本地的aar
- Cookie, Session, LocalStorage, SessionStorage, Etag, Expire
- caffe命令行解析
- java带参数的构造方法_java练习本(20190603)
- 美国网站服务器有哪些,可以搭建什么网站?
- Multistage GAN for Fabric Defect Detection 用于织物检测的多级GAN
- php有个schost.exe_全面认识Svchost.exe进程
- 对微信公众号文章爬取进行分析
- 能不用事务就尽量别用
- HDR视频生态系统纵览
- 金三银四已过,为大家整理一批高频java面试题,花点耐心看完,offer拿到手软!
- Kafka中auto.offset.reset配置项参数为earliest/或者latest的区别
- Unity开发手游常用适配分辨率
- TWaver GIS制作穹顶之下的雾霾地图