Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >图解面试题:如何分析用户满意度?

图解面试题:如何分析用户满意度?

原创
作者头像
猴子数据分析
修改于 2020-02-17 03:33:38
修改于 2020-02-17 03:33:38
94400
代码可运行
举报
文章被收录于专栏:猴子数据分析猴子数据分析
运行总次数:0
代码可运行

【题目】  

 “满意度表”记录了教师和学生对课程的满意程度。“是否满意”列里是老师和学生对课程的评价,其中“是”表示教师和学生都满意。

 “ 用户表”记录了学校教师和学生的信息。每个用户有唯一键 “编号”,“是否在系统”表示这个用户是否还在这所学校里,“角色”表示这个人是学生还是教师。

两个表的关系:满意度表的“学生编号” 、 “教师编号” 和用户表的 “编号” 联结。

现在需要分析出学校里人员对课程的满意度。满意度的计算方式如下:

(教师和学生对课程都满意且已存在当前教务系统中的用户) / (在学校里的人数)

【解题思路】

1.多表联结

统计满意度的前提是需要用户在学校里,需要用到“用户表”里的“是否在系统”来判断。满意度需要用到“满意度表”。所以涉及到两个表里的数据,就要用到《猴子 从零学会sql》里讲过的多表联结。

那么,使用哪种联结呢?

统计值为满意度,所以使用“满意度表”为主表,进行左联结。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * 
from 满意度表
left join 用户表;

​如何联结呢?

两个表的关系:满意度表的“学生编号” 、 “教师编号” 和用户表的 “编号” 联结。所以联结条件是:

满意度表.教师编号 = 用户表.编号 or 满意度表.学生编号 = 用户表.编号

基于上面的分析,多表联结查询sql语句如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * 
from 满意度表
left join 用户表
on (满意度表.教师编号 = 用户表.编号 or 
    满意度表.学生编号 = 用户表.编号);

2.查询条件

满意度等于:

(教师和学生对课程都满意且已存在当前教务系统中的用户) / (在学校里的人数)

由这个公式可以知道,分子和分母计算的前提都是存在学校里的用户。所以,查询条件是:用户表中存在学校里的用户。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
where 用户表.是否在系统 = '是'

把条件子句加入前面的多表查询sql里,就是下面的sql:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * 
from 满意度表
left join 用户表
on (满意度表.教师编号 = 用户表.编号 or 满意度表.学生编号 = 用户表.编号)
where 用户表.是否在系统 = '是';

上面sql运行结果如下,我们发现,教师编号“02”不在学校里(对应的列“是否在系统”里的值是“否”),这是怎么回事呢?

我们重新梳理一遍逻辑。

目前的逻辑是:(教师编号 = 编号 或 学生编号 = 编号) 且 编号在学校中。这等价于:

(教师编号 = 编号 且 编号在学校中) (学生编号 = 编号,且 编号在学校中)

这里的“或”逻辑会将范围扩大,所以且不在学校的“02”号教师也会出现在查询结果中。

正确的做法是先从表中分别选出“在学校”里的学生和教师,然后再多表联结。也就是:

(教师编号 = 编号 且 该编号在系统中 )并且

(学生编号 = 编号 且 该编号在系统中)

对应的sql如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * 
from 满意度表 
left join(select 编号 from 用户表 where 是否在系统='是') as 学生
on (满意度表.学生编号 = 学生.编号)
left join(select 编号 from 用户表 where 是否在系统='是') as 教师
on (满意度表.教师编号 = 教师.编号);

3.统计

满意度等于:

(教师和学生对课程都满意且已存在当前教务系统中的用户) / (在学校里的人数)

我把这个公示简化为:满意度=a/b

其实a=教师和学生对课程都满意且已存在当前教务系统中的用户

b=在学校里的人数

我们只需要把a和b的值计算出来就可以啦。

1)计算a

统计好“是否满意”列里有多少个值为“是”。

我们可以把“是”转化成1,然后累计求和,对应的sql就是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum(case when 是否满意='是' then 1 
    else 0 
    end)

2)计算b

b=在学校里的人数,直接用计数函数(count)就可以:count(是否满意)

3)计算出满意度

满意度=a/b,也就是

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sum(case when 是否满意='是' then 1 else 0 end)/count(是否满意) 
as 满意度

把这个计算公示加入前面sql语句的查询结果里就是(下面的select子句):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select sum(case when 满意度表.是否满意='是' then 1 else 0 end)/count(满意度表.是否满意) as 满意度
from 满意度表 
left join(select 编号 from 用户表 where 是否在系统='是') as 学生
on (满意度表.学生编号 = 学生.编号)
left join(select 编号 from 用户表 where 是否在系统='是') as 教师
on (满意度表.教师编号 = 教师.编号);

最后查询结果是满意度=0.75。

【本题考点】

● 考察多表查询的应用

● 如何将业务需求转换为sql语句的能力

● 聚合函数的运用

【举一反三】

 下表是一家出行公司(比如滴滴、Uber)的数据库表。乘客通过该公司的app叫车,司机通过app接收订单。

Users 表里存放的是用户信息。每个用户有唯一值(Users_Id) 。Banned 表示用户是否因为违规被禁止使用app。Role 记录了用户的角色,里面的值driver是司机,client是乘客,partner是合伙人。

Trips 表记录了各个出租车的行程信息。每段行程有唯一键(Id) 。Status 行程类型 ‘completed’表行程正常结束, ‘cancelled_by_driver’ 表示行程因为司机原因取消,‘cancelled_by_client’表示行程因为乘客原因取消。

两个表的联结关系:Trips 表(Client_Id 、 Driver_Id) 和 Users 表中 Users_Id 的联结。    

写一段 SQL 语句查出非禁止用户的取消率。

 取消率的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)

参考答案:

1.多表联结,找出非禁止的用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * 
from trips
left join (select users_id from users where banned = 'no') as client
on (trips.Client_Id = client.users_id)
left join (select users_id from users where banned = 'no') as driver
on (trips.Driver_Id = driver.users_id);

2.按日期分组

因为要计算的是“每天”的取消率,所以要按日期分组,统计每一天的。

group by trips.request_at

3.计算取消率

被司机或乘客取消的非禁止用户生成的订单数量=

sum(case when status = 'completed' then 1 else 0 end)

非禁止用户生成的订单总数=count(status)

最终sql如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select sum(case when trips.status = 'completed' then 1 else 0 end) / count(trips.status) 
from trips
left join (select users_id from users where banned = 'no') as client
on (trips.Client_Id = client.users_id)
left join (select users_id from users where banned = 'no') as driver
on (trips.Driver_Id = driver.users_id);
group by trips.request_at;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图解面试题:如何分析用户满意度?
“满意度表”记录了教师和学生对课程的满意程度。“是否满意”列里是老师和学生对课程的评价,其中“是”表示教师和学生都满意。
猴子数据分析
2020/12/11
8540
LeetCode MySQL 262. 行程和用户
Trips 表中存所有出租车的行程信息。 每段行程有唯一键 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键。 Status 是枚举类型,枚举成员为 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。
Michael阿明
2021/02/19
3550
【每日SQL打卡】​​​​​​​​​​​​​​​DAY 3丨行程和用户【难度困难】
Trips 表中存所有出租车的行程信息。每段行程有唯一键 Id,Client_Id 和 Driver_Id 是 Users 表中 Users_Id 的外键。Status 是枚举类型,枚举成员为 (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’)。
不吃西红柿
2022/07/29
3400
「SQL面试题库」 No_15 行程和用户
「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试,代码能力和工作效率也会有明显提升。
不吃西红柿
2023/03/25
3120
MySQL简单实践(三)
2),编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资:
用户5473628
2019/08/08
4240
262. Trips and Users
The Trips table holds all taxi trips. Each trip has a unique Id, while Client_Id and Driver_Id are both foreign keys to the Users_Id at the Users table. Status is an ENUM type of (‘completed’, ‘cancelled_by_driver’, ‘cancelled_by_client’).
Dylan Liu
2019/07/01
3700
图解面试题:你有多久没涨过工资了?
“雇员表“中记录了员工的信息,“薪水表“中记录了对应员工发放的薪水。两表通过“雇员编号”关联。
猴子聊数据分析
2020/05/22
6650
比较经典的SQL面试题
我根据题目重新梳理了一遍,包括表结构,表之间的关系,测试数据,题目,参考答案等。其中大部分参考答案在各种数据库平台上通用。
jamesjiang
2022/11/20
8720
比较经典的SQL面试题
​LeetCode刷题实战262:行程和用户
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/05/28
2750
图解面试题:多表如何查询?
查询结果的列名“学号”、“姓名”,在“学生”表里,列名“课程”、“成绩”在“成绩”表里,所以需要进行多表查询。
猴子聊数据分析
2019/12/27
7580
7天快速掌握MySQL-DAY6
首先公布一下DAY5的作业答案。 项目七: --code-- CREATE TABLE Employee ( Id INT NOT NULL PRIMARY KEY, Name VARCHAR(50) NOT NULL, Salary INT NOT NULL, Departmentid INT NOT NULL ) ; INSERT INTO Employee(Id,Name,Salary,Departmentid) VALUES (1,'Joe',70000,1); INSERT
披头
2019/12/26
2700
2022-12-11:行程和用户。以下为输出结果,请问sql语句如何写?+------------+--------------
2022-12-11:行程和用户。以下为输出结果,请问sql语句如何写? +------------+-------------------+ | Day | Cancellation Rate | +------------+-------------------+ | 2013-10-01 | 0.33 | | 2013-10-02 | 0.00 | | 2013-10-03 | 0.50 | +-------
福大大架构师每日一题
2023/02/01
4250
这些SQL技能你都会吗? 经典SQL面试题送给你(附答案)
首先熟悉一下数据库相关专业名词, 比如DB、 DBMS和SQL,这些概念常常让人傻傻分不清楚。
CDA数据分析师
2021/02/07
8160
这些SQL技能你都会吗? 经典SQL面试题送给你(附答案)
2022-12-11:行程和用户。以下为输出结果,请问sql语句如何写? +------------+-------------------+ | Day |
2022-12-11:行程和用户。以下为输出结果,请问sql语句如何写?+------------+-------------------+| Day | Cancellation Rate |+------------+-------------------+| 2013-10-01 | 0.33 || 2013-10-02 | 0.00 || 2013-10-03 | 0.50 |+------------+--
福大大架构师每日一题
2022/12/11
3650
2022-12-11:行程和用户。以下为输出结果,请问sql语句如何写? +------------+-------------------+ | Day |
图解面试题:查找不在表里的数据
下面是学生的名单,表名为“学生表”;近视学生的名单,表名为“近视学生表”。请问不是近视眼的学生都有谁?
Lenis
2019/12/25
3510
图解面试题:查找不在表里的数据
图解面试题:如何分析游戏?
猴子是一个班级的班主任,由于所带班级的学生成绩普遍不是很好。现在他需要找出每门课程中成绩最差的学生,然后有针对性的辅导。
猴子聊数据分析
2020/04/12
6040
图解面试题:如何找到喜欢的电影?
某电影平台(类似豆瓣、猫眼电影)用3个表来记录电影信息。“电影表”中是电影编号、电影名称、电影描述信息。
猴子聊数据分析
2020/08/10
1.1K0
图解面试题:经典50题
翻译成大白话:计算每个学号不及格分数个数,筛选出大于2个的学号并找出姓名,平均成绩,思路如图:
猴子聊数据分析
2020/06/24
6360
小红书面试题:如何分析用户行为?
小红书月活跃用户数已经过亿,用户在小红书上通过文字、图片、视频笔记分享生活,并创建相关商品链接,吸引相同爱好的用户进行收藏购买,用户的消费有什么行为特征呢?(小红书面试题)
猴子数据分析
2021/01/22
7520
比较复杂的sql面试题「建议收藏」
题目详见:https://leetcode.com/problems/trips-and-users/
全栈程序员站长
2022/07/29
5510
推荐阅读
相关推荐
图解面试题:如何分析用户满意度?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验