SQL练习01

1.游戏玩法分析

SQL

Create table If Not Exists Activity (player_id int, device_id int, event_date date, games_played int);
Truncate table Activity;
insert into Activity (player_id, device_id, event_date, games_played) values ('1', '2', '2016-03-01', '5');
insert into Activity (player_id, device_id, event_date, games_played) values ('1', '2', '2016-03-02', '6');
insert into Activity (player_id, device_id, event_date, games_played) values ('2', '3', '2017-06-25', '1');
insert into Activity (player_id, device_id, event_date, games_played) values ('3', '1', '2016-03-02', '0');
insert into Activity (player_id, device_id, event_date, games_played) values ('3', '4', '2018-07-03', '5');

Table: Activity

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| player_id    | int     |
| device_id    | int     |
| event_date   | date    |
| games_played | int     |
+--------------+---------+
(player_id,event_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
思路
1.获取每个用户第一次登录时间
2.连接Activity表
3.计算event_date的差值为1的记录
4.排除没有连续登录的记录
题解
select  round(avg(t2.event_date is not null), 2) fraction
from (-- 获取第一天select player_id,min(event_date)event_datefrom Activitygroup by player_id
) t1
left join Activity t2
on t1.player_id=t2.player_id and datediff(t2.event_date,t1.event_date) =1

2.至少有5名直接下属的经理

SQL

Create table If Not Exists Employee (id int, name varchar(255), department varchar(255), managerId int);
Truncate table Employee;
insert into Employee (id, name, department, managerId) values ('101', 'John', 'A', '0');
insert into Employee (id, name, department, managerId) values ('102', 'Dan', 'A', '101');
insert into Employee (id, name, department, managerId) values ('103', 'James', 'A', '101');
insert into Employee (id, name, department, managerId) values ('104', 'Amy', 'A', '101');
insert into Employee (id, name, department, managerId) values ('105', 'Anne', 'A', '101');
insert into Employee (id, name, department, managerId) values ('106', 'Ron', 'B', '101');

表: Employee

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
| department  | varchar |
| managerId   | int     |
+-------------+---------+SQL 中,id 是该表的主键列。
该表的每一行都表示雇员的名字、他们的部门和他们的经理的id。
如果managerId为空,则该员工没有经理。
没有员工会成为自己的管理者。

查询至少有5名直接下属的经理 。

任意顺序 返回结果表。

查询结果格式如下所示。

示例 1:

输入: 
Employee 表:
+-----+-------+------------+-----------+
| id  | name  | department | managerId |
+-----+-------+------------+-----------+
| 101 | John  | A          | None      |
| 102 | Dan   | A          | 101       |
| 103 | James | A          | 101       |
| 104 | Amy   | A          | 101       |
| 105 | Anne  | A          | 101       |
| 106 | Ron   | B          | 101       |
+-----+-------+------------+-----------+
输出: 
+------+
| name |
+------+
| John |
+------+

思路

1.获取每个经理下的员工
2.通过连表的方式进行连接
3.筛选出有5名直接下属的经理

题解

方式一:
-- 2.查询至少有5名直接下属的经理
select name
from 
(
-- 1.两个连接
select t1.name,count(distinct t2.id) distinctId
from employee t1
left join employee t2 
on t1.id=t2.managerId
group by t1.id
)t
where distinctId>=5方式二:
-- 1.两个连接
select t1.name,count(distinct t2.id) distinctId
from employee t1
left join employee t2 
on t1.id=t2.managerId
group by t1.id
-- 2.查询至少有5名直接下属的经理
having distinctId>=5

3.2016的投资

SQL

Create Table If Not Exists Insurance (pid int, tiv_2015 float, tiv_2016 float, lat float, lon float);
Truncate table Insurance;
INSERT INTO Insurance (pid, tiv_2015, tiv_2016, lat, lon) VALUES
(1, 224.17, 952.73, 32.4, 20.2),
(2, 224.17, 900.66, 52.4, 32.7),
(3, 824.61, 645.13, 72.4, 45.2),
(4, 424.32, 323.66, 12.4, 7.7),
(5, 424.32, 282.9, 12.4, 7.7),
(6, 625.05, 243.53, 52.5, 32.8),
(7, 424.32, 968.94, 72.5, 45.3),
(8, 624.46, 714.13, 12.5, 7.8),
(9, 425.49, 463.85, 32.5, 20.3),
(10, 624.46, 776.85, 12.4, 7.7),
(11, 624.46, 692.71, 72.5, 45.3),
(12, 225.93, 933, 12.5, 7.8),
(13, 824.61, 786.86, 32.6, 20.3),
(14, 824.61, 935.34, 52.6, 32.8);

Insurance 表:

+-------------+-------+
| Column Name | Type  |
+-------------+-------+
| pid         | int   |
| tiv_2015    | float |
| tiv_2016    | float |
| lat         | float |
| lon         | float |
+-------------+-------+
pid 是这张表的主键(具有唯一值的列)。
表中的每一行都包含一条保险信息,其中:
pid 是投保人的投保编号。
tiv_2015 是该投保人在 2015 年的总投保金额,tiv_2016 是该投保人在 2016 年的总投保金额。
lat 是投保人所在城市的纬度。题目数据确保 lat 不为空。
lon 是投保人所在城市的经度。题目数据确保 lon 不为空。

编写解决方案报告 2016 年 (tiv_2016) 所有满足下述条件的投保人的投保金额之和:

  • 他在 2015 年的投保额 (tiv_2015) 至少跟一个其他投保人在 2015 年的投保额相同。
  • 他所在的城市必须与其他投保人都不同(也就是说 (lat, lon) 不能跟其他任何一个投保人完全相同)。

tiv_2016 四舍五入的 两位小数

查询结果格式如下例所示。

示例 1:

输入:
Insurance 表:
| pid | tiv_2015 | tiv_2016 | lat  | lon  |
| --- | -------- | -------- | ---- | ---- |
| 1   | 224.17   | 952.73   | 32.4 | 20.2 |
| 2   | 224.17   | 900.66   | 52.4 | 32.7 |
| 3   | 824.61   | 645.13   | 72.4 | 45.2 |
| 4   | 424.32   | 323.66   | 12.4 | 7.7  |
| 5   | 424.32   | 282.9    | 12.4 | 7.7  |
| 6   | 625.05   | 243.53   | 52.5 | 32.8 |
| 7   | 424.32   | 968.94   | 72.5 | 45.3 |
| 8   | 624.46   | 714.13   | 12.5 | 7.8  |
| 9   | 425.49   | 463.85   | 32.5 | 20.3 |
| 10  | 624.46   | 776.85   | 12.4 | 7.7  |
| 11  | 624.46   | 692.71   | 72.5 | 45.3 |
| 12  | 225.93   | 933      | 12.5 | 7.8  |
| 13  | 824.61   | 786.86   | 32.6 | 20.3 |
| 14  | 824.61   | 935.34   | 52.6 | 32.8 | 
+-----+----------+----------+-----+-----+
输出:
+----------+
| tiv_2016 |
+----------+
| 4220.72  |
+----------+
解释:
表中的第一条记录和最后一条记录都满足两个条件。
tiv_2015 值为 10 与第三条和第四条记录相同,且其位置是唯一的。第二条记录不符合任何一个条件。其 tiv_2015 与其他投保人不同,并且位置与第三条记录相同,这也导致了第三条记录不符合题目要求。
因此,结果是第一条记录和最后一条记录的 tiv_2016 之和,即 45

思路

1.获取tiv_2015相同投保额的次数超过1
2.获取所在的城市经纬度不一样

题解

方式一:
SELECTround(SUM(insurance.TIV_2016),2) AS TIV_2016
FROMinsurance
WHEREinsurance.TIV_2015 IN(SELECTTIV_2015FROMinsuranceGROUP BY TIV_2015HAVING COUNT(*) > 1)AND CONCAT(LAT, LON) IN(SELECTCONCAT(LAT, LON)FROMinsuranceGROUP BY LAT , LONHAVING COUNT(*) = 1);方式二:SELECTROUND( SUM( tiv_2016 ), 2 ) tiv_2016 
FROM( SELECT *, COUNT(*) OVER ( PARTITION BY tiv_2015 ) cnt_tiv_2015, COUNT(*) OVER ( PARTITION BY lat, lon ) cnt_lat FROM Insurance ) t 
WHEREcnt_tiv_2015 > 1 AND cnt_lat =1

4.好友申请:谁有最多的好友

SQL

Create table If Not Exists RequestAccepted (requester_id int not null, accepter_id int null, accept_date date null);
Truncate table RequestAccepted;
insert into RequestAccepted (requester_id, accepter_id, accept_date) values ('1', '2', '2016/06/03');
insert into RequestAccepted (requester_id, accepter_id, accept_date) values ('1', '3', '2016/06/08');
insert into RequestAccepted (requester_id, accepter_id, accept_date) values ('2', '3', '2016/06/08');
insert into RequestAccepted (requester_id, accepter_id, accept_date) values ('3', '4', '2016/06/09');

RequestAccepted 表:

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| requester_id   | int     |
| accepter_id    | int     |
| accept_date    | date    |
+----------------+---------+
(requester_id, accepter_id) 是这张表的主键(具有唯一值的列的组合)。
这张表包含发送好友请求的人的 ID ,接收好友请求的人的 ID ,以及好友请求通过的日期。

编写解决方案,找出拥有最多的好友的人和他拥有的好友数目。

生成的测试用例保证拥有最多好友数目的只有 1 个人。

查询结果格式如下例所示。

示例 1:

输入:
RequestAccepted 表:
+--------------+-------------+-------------+
| requester_id | accepter_id | accept_date |
+--------------+-------------+-------------+
| 1            | 2           | 2016/06/03  |
| 1            | 3           | 2016/06/08  |
| 2            | 3           | 2016/06/08  |
| 3            | 4           | 2016/06/09  |
+--------------+-------------+-------------+
输出:
+----+-----+
| id | num |
+----+-----+
| 3  | 3   |
+----+-----+
解释:
编号为 3 的人是编号为 124 的人的好友,所以他总共有 3 个好友,比其他人都多。

思路

成为朋友是一个双向的过程,所以如果一个人接受了另一个人的请求,他们两个都会多拥有一个朋友。
所以我们可以将 requester_id 和 accepter_id 联合起来,然后统计每个人出现的次数。
1.使用union拼接两个表结果

题解

方式一:
select id, sum(count_id)num
from 
(
select requester_id id,count(requester_id) count_id
from RequestAccepted 
group by requester_id
union all 
select accepter_id id,count(accepter_id) count_id
from RequestAccepted 
group by accepter_id
)t
group by id
order by sum(count_id) desc
limit 1方式二:
select id, count(id)num
from 
(
select requester_id id
from RequestAccepted 
union all 
select accepter_id id
from RequestAccepted 
)t
group by id
order by num desc
limit 1

5.树节点

SQL

Create table If Not Exists Tree (id int, p_id int);
Truncate table Tree;
insert into Tree (id, p_id) values ('1', null);
insert into Tree (id, p_id) values ('2', '1');
insert into Tree (id, p_id) values ('3', '1');
insert into Tree (id, p_id) values ('4', '2');
insert into Tree (id, p_id) values ('5', '2');

表:Tree

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| p_id        | int  |
+-------------+------+
id 是该表中具有唯一值的列。
该表的每行包含树中节点的 id 及其父节点的 id 信息。
给定的结构总是一个有效的树。

树中的每个节点可以是以下三种类型之一:

  • “Leaf”:节点是叶子节点。
  • “Root”:节点是树的根节点。
  • “lnner”:节点既不是叶子节点也不是根节点。

编写一个解决方案来报告树中每个节点的类型。

任意顺序 返回结果表。

结果格式如下所示。

示例 1:

img

输入:
Tree table:
+----+------+
| id | p_id |
+----+------+
| 1  | null |
| 2  | 1    |
| 3  | 1    |
| 4  | 2    |
| 5  | 2    |
+----+------+
输出:
+----+-------+
| id | type  |
+----+-------+
| 1  | Root  |
| 2  | Inner |
| 3  | Leaf  |
| 4  | Leaf  |
| 5  | Leaf  |
+----+-------+
解释:
节点 1 是根节点,因为它的父节点为空,并且它有子节点 2 和 3。
节点 2 是一个内部节点,因为它有父节点 1 和子节点 4 和 5。
节点 3、4 和 5 是叶子节点,因为它们有父节点而没有子节点。

示例 2:

img

输入:
Tree table:
+----+------+
| id | p_id |
+----+------+
| 1  | null |
+----+------+
输出:
+----+-------+
| id | type  |
+----+-------+
| 1  | Root  |
+----+-------+
解释:如果树中只有一个节点,则只需要输出其根属性

思路

我们可以按照下面的定义,求出每一条记录的节点类型。Root: 没有父节点
Inner: 它是某些节点的父节点,且有非空的父节点
Leaf: 除了上述两种情况以外的节点

题解

SELECTid AS `Id`,CASEWHEN tree.id = (SELECT a.id FROM tree a WHERE a.p_id IS NULL)THEN 'Root'WHEN tree.id IN (SELECT a.p_id FROM tree a)THEN 'Inner'ELSE 'Leaf'END AS Type
FROMtree
ORDER BY `Id`;

null |
±—±-----+
输出:
±—±------+
| id | type |
±—±------+
| 1 | Root |
±—±------+
解释:如果树中只有一个节点,则只需要输出其根属性


**思路**```sql
我们可以按照下面的定义,求出每一条记录的节点类型。Root: 没有父节点
Inner: 它是某些节点的父节点,且有非空的父节点
Leaf: 除了上述两种情况以外的节点

题解

SELECTid AS `Id`,CASEWHEN tree.id = (SELECT a.id FROM tree a WHERE a.p_id IS NULL)THEN 'Root'WHEN tree.id IN (SELECT a.p_id FROM tree a)THEN 'Inner'ELSE 'Leaf'END AS Type
FROMtree
ORDER BY `Id`;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟局域网

虚拟局域网(VLAN) VLAN建立于交换技术的基础之上 广播域(broadcast domain):其中任何一台设备发出的广播通信都能被该部分网络中的所有其他设备所接收,这部分网络就叫广播域利用以太网交换机可以很方便地实现虚拟局域网VLAN(Virtual LAN)对于一个主机和…

【C++】——运算符重载

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

区块链探秘:从基础到深度,全面解读区块链技术与应用

1.区块链基本概念 1.发展历史 比特币诞生: 2008年,化名为中本聪的人发表了论文《Bitcoin:A Peer-to-Peer Electronic Cash System》 2009年1月3日,中本聪开发运行了比特币客户端程序并进行了首次挖矿,获得了第一批…

2023年开发语言和数据库排行

2023年开发语言和数据库排行 一、开发语言相关1. Python1.1 Python优点1.2 Python缺点1.3 Python应用领域 2. C 语言2.1 C 语言优点2.2 C 语言缺点2.3 C语言应用领域 3. Java3.1 Java 优点3.2 Java缺点3.3 Java应用场景 4. C4.1 C 优点4.2 C 缺点4.3 C 应用场景 5. C#5.1 C# 优…

2013年01月16日 Go生态洞察:并发不是并行

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

飞天使-template模版相关知识

遇到报错django.template.exceptions.TemplateSyntaxError: ‘staticfiles’ is not a registered tag library. Must ROOT_URLCONF TEMPLATES [{BACKEND: django.template.backends.django.DjangoTemplates,DIRS: [os.path.join(BASE_DIR, templates)],APP_DIRS: True,OPTI…

为什么要用kubernetes?

第一章 kubernetes介绍 本章节主要介绍应用程序在服务器上部署方式演变以及kubernetes的概念、组件和工作原理。 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物…

asp.net学生宿舍管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 学生宿舍管理系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言 开发 asp.net学生宿舍管理系统1 应用技…

京东数据运营与分析:如何全面获取电商销售数据?

随着电商行业的快速发展,数据分析成为了电商运营中一个非常重要的环节,这一环往往能够帮助品牌方来提升销售业绩和管理效率。然而,如何获取到电商平台中详细、全面的销售数据是很多电商品牌方所关心的问题,事实上,第三…

前端开发引入element plus与windi css

背景 前端开发有很多流行框架,像React 、angular、vue等等,本文主要讲vue 给新手用的教程,其实官网已经写的很清楚,这里再啰嗦只是为了给新手提供一个更加简单明了的参考手册。 一、打开element plus官网选则如图所示模块安装命令…

No200.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

如何利用大模型蒸馏出小模型实现降本

如何让小模型的推理效果在某些领域比 ChatGPT 这样的大模型还要更强?这篇论文提供了一个思路:https://arxiv.org/abs/2212.10071,借助思维链(CoT)逐步解决复杂推理任务的能力,可以使用大模型作为推理教师&a…

【Python基础篇】变量

博主:👍不许代码码上红 欢迎:🐋点赞、收藏、关注、评论。 格言: 大鹏一日同风起,扶摇直上九万里。 文章目录 一 Python中变量的定义二 Python中变量的使用三 Python中变量的类型四 Python中变量的删除五 …

Element-Ui el-table 动态添加行

一、在项目需要使用 这个需求主要是在项目中需要用到 1.点击新增按钮,可以实现新增行。 2.在每个列里面可以进行输入。 3.可以删除新增的行,包括数据。 二、HTML代码 1.主要是循环每一个列,而且这些列都是动态,根据父组件传过来…

【Unity之UI编程】编写一个面板交互界面需要注意的细节

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

千兆路由只有200M,原来是模式选择不对,也找到了内网不能通过动态域名访问内部服务的原因

本来1000M的宽带接入的,但是一测试发现只有200M,把电信叼了过来, 一测试发现宽带没问题,网线正常,网卡正常,只有可能是路由器的问题了,尴尬了,赶紧给满意好评放他走。回头好好研究一…

nvm工具解决nodejs版本切换问题

常见版本问题 npm启动vite项目报错,信息如下 npm run dev> my-vue-app0.0.0 dev D:\data\code\document-assistant-web > vitefile:///D:/data/code/document-assistant-web/node_modules/vite/bin/vite.js:7await import(source-map-support).then((r) >…

3D模型人物换装系统三(优化合批处理,提取合批配置可,封装)

3D模型人物换装系统三(优化合批处理,提取合批配置可,封装) 介绍法线贴图问题规划以及封装缺陷修改整理 整合总结 介绍 本文使用2018.4.4和2020.3.26进行的测试 这里先说一下我上一篇没有解决的问题,法线贴图不正确&am…

计算机网络基础知识-网络协议

一:计算机网络层次划分 1. 网络层次划分 2. OSI七层网络模型 1)物理层(Physical Layer):及硬件设备,物理层确保原始的数据可在各种物理媒体上传输,常见的设备名称如中继器(Repeater,也叫放大器)和集线器; 2)数据链路层(Data Link Layer):数据链路层在物理层提…

SpringCache(Redis)

一、springcache是什么 springcache是spring的缓存框架,利用了AOP,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能了…