【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】进阶学习与题目补充相关推荐

  1. 【SQL学习笔记】《SQL进阶教程》1.1

    SQL进阶教程学习笔记1.1 1-1case 表达式 将已有编号方式转换为新的方式并统计 SELECT CASE pref_nameWHEN '辽宁' THEN '东北'WHEN '福建' THEN ...

  2. Mysql进阶学习所用到的SQL测试库代码

    Mysql进阶学习所用到的SQL测试库代码 一.`myemployees`库 二.`girls`库 一.myemployees库 /* SQLyog Ultimate v10.00 Beta1 MyS ...

  3. idea中连接mysql插入成功数据 在navicat中刷新表格没有数据_第九篇 数据分析的进阶学习-SQL入门...

    1.SQL的学习阶段 1.1 背景 随着互联网的不断发展,数据的不断累积,现在单单使用Excel已经不能满足数据分析的需求了,因此作为一个数据分析工作者,掌握Excel是基础,而SQL作为主流数据库查 ...

  4. Java学习路线-42:SQL进阶:约束、关系、连接

    SQL进阶:约束.关系.连接 课时1 1.单表的查询练习 可视化客户端 SQLyog -- 查询部门编号为30的所有员工 select * from emp where deptno=30;-- 查询 ...

  5. 【第21天】SQL进阶-查询优化- performance_schema系列三:事件记录(SQL 小虚竹)

    回城传送–><32天SQL筑基> 文章目录 零.前言 一.练习题目 二.SQL思路 SQL进阶-查询优化- performance_schema系列三:事件记录 等待事件表 even ...

  6. SQL训练营学习笔记

    学习知识点概要 学习内容 学习问题与解答 学习思考与总结 Task01:初识数据库与SQL 目录 一.初识数据库 1.1 DBMS的种类 1.2 RDBMS的常见系统结构 1.3 数据库安装 1.3. ...

  7. SQL进阶随笔--case用法(一)

    SQL进阶一整个是根据我看了pdf版本的整理以及自己的见解整理.后期也方便我自己查看和复习. CASE 表达式 CASE 表达式是从 SQL-92 标准开始被引入的.可能因为它是相对较新的技术,所以尽 ...

  8. 【SQL进阶】03.执行计划之旅1 - 初探

    听到大牛们说执行计划,总是很惶恐,是对知识的缺乏的惶恐,所以必须得学习执行计划,以减少对这一块知识的惶恐,下面是对执行计划的第一讲-理解执行计划. 本系列[T-SQL]主要是针对T-SQL的总结. S ...

  9. SQL进阶,子查询与窗口函数

    本节给大家讲解SQL在实际过程中用途比较多的子查询与窗口函数,下面一起学习. 示例工具:MySQL8.0.Navicat Premium 12 本文讲解内容:子查询与窗口函数 适用范围:SQL进阶应用 ...

最新文章

  1. 如何解决代码中if…else 过多的问题
  2. 腾讯面经 | 数据从业者的一次“典型”面试
  3. kali Linux/centos7 Linux设置不会屏保
  4. PHP 是最糟糕编程语言?
  5. 0514实训演练 新建项目 使用java编写类与对象 入门
  6. python 调取百度网盘API,实现上传下载
  7. Android 模块化编程之引用本地的aar
  8. Cookie, Session, LocalStorage, SessionStorage, Etag, Expire
  9. caffe命令行解析
  10. java带参数的构造方法_java练习本(20190603)
  11. 美国网站服务器有哪些,可以搭建什么网站?
  12. Multistage GAN for Fabric Defect Detection 用于织物检测的多级GAN
  13. php有个schost.exe_全面认识Svchost.exe进程
  14. 对微信公众号文章爬取进行分析
  15. 能不用事务就尽量别用
  16. HDR视频生态系统纵览
  17. 金三银四已过,为大家整理一批高频java面试题,花点耐心看完,offer拿到手软!
  18. Kafka中auto.offset.reset配置项参数为earliest/或者latest的区别
  19. Unity开发手游常用适配分辨率
  20. TWaver GIS制作穹顶之下的雾霾地图

热门文章

  1. 关于移动硬盘故障:使用驱动器G:中的光盘之前需要将其格式化或者无法访问磁盘G:参数错误的解决办法
  2. 自学JavaScript第一天- JS 基础
  3. VTK学习-第一个多柱体生成
  4. 华为云-实时流计算服务CS
  5. windows下pip下载库速度慢
  6. 无人驾驶(目前的自动驾驶方案)
  7. AK5703的ALC
  8. 正则表达式的相关操作和验证
  9. 关于 /dev/urandom 的流言终结
  10. iphone QQ音乐锁屏歌词实现思路