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

简介:

【题目】

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

_1

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

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

现在需要分析出学校里人员对课程的满意度。满意度的计算方式如下:
(教师和学生对课程都满意且已存在当前教务系统中的用户) / (在学校里的人数)

【解题思路】

1.多表联结

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

那么,使用哪种联结呢?

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

from 满意度表
left join 用户表;

​如何联结呢?

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

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

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

from 满意度表
left join 用户表
on (满意度表.教师编号 = 用户表.编号 or 
    满意度表.学生编号 = 用户表.编号);

2.查询条件

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

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

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

from 满意度表
left join 用户表
on (满意度表.教师编号 = 用户表.编号 or 满意度表.学生编号 = 用户表.编号)
where 用户表.是否在系统 = '是';

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

_4

我们重新梳理一遍逻辑。

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

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

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

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

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

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

对应的sql如下:

from 满意度表 
left join(select 编号 from 用户表 where 是否在系统='是') as 学生
on (满意度表.学生编号 = 学生.编号)
left join(select 编号 from 用户表 where 是否在系统='是') as 教师
on (满意度表.教师编号 = 教师.编号);​

_5

3.统计

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

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

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

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

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

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

    else 0 
    end)

2)计算b

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

3)计算出满意度

满意度=a/b,也就是

as 满意度

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

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是合伙人。

_9

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

_8

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

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

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

参考答案:

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

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如下:

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;
相关文章
|
3月前
|
机器学习/深度学习 算法 数据中心
【机器学习】面试问答:PCA算法介绍?PCA算法过程?PCA为什么要中心化处理?PCA为什么要做正交变化?PCA与线性判别分析LDA降维的区别?
本文介绍了主成分分析(PCA)算法,包括PCA的基本概念、算法过程、中心化处理的必要性、正交变换的目的,以及PCA与线性判别分析(LDA)在降维上的区别。
93 4
|
4月前
|
监控 Java 开发者
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
Java面试题:如何使用JVM工具(如jconsole, jstack, jmap)来分析内存使用情况?
205 2
|
4月前
|
算法 Java API
Android性能优化面试题经典之ANR的分析和优化
Android ANR发生于应用无法在限定时间内响应用户输入或完成操作。主要条件包括:输入超时(5秒)、广播超时(前台10秒/后台60秒)、服务超时及ContentProvider超时。常见原因有网络、数据库、文件操作、计算任务、UI渲染、锁等待、ContentProvider和BroadcastReceiver的不当使用。分析ANR可借助logcat和traces.txt。主线程执行生命周期回调、Service、BroadcastReceiver等,避免主线程耗时操作
66 3
|
4月前
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
64 0
|
4月前
|
设计模式 安全 Java
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
114 0
|
4月前
|
Java
Java面试题:Java内存模型与并发编程知识点,解释Java中“happens-before”的关系,分析Java中的内存一致性效应(Memory Consistency Effects)及其重要性
Java面试题:Java内存模型与并发编程知识点,解释Java中“happens-before”的关系,分析Java中的内存一致性效应(Memory Consistency Effects)及其重要性
28 0
|
5月前
|
安全 Java 数据安全/隐私保护
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
45 0
|
5月前
|
JSON 安全 Java
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
72 0
|
6月前
|
安全 测试技术
面试题2:测试人员何时参与需求分析,并且要分析需求的哪些方面?
面试题2:测试人员何时参与需求分析,并且要分析需求的哪些方面?
面试题2:测试人员何时参与需求分析,并且要分析需求的哪些方面?
|
6月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_55 销售分析 I
「SQL面试题库」 No_55 销售分析 I

相关实验场景

更多
下一篇
无影云桌面