ITPub博客

首页 > 数据库 > 数据库开发技术 > 如何进行帕累托分析

如何进行帕累托分析

原创 数据库开发技术 作者:猴子数据分析 时间:2023-04-18 19:06:07 0 删除 编辑

【面试题】有一张“学生成绩表”,包含3个字段:学号、课程、成绩。



问题:找出每门课程A类和B类的学生,判断标准是累计占比,0~60%的记为A类,60%~85%记为B类


【解题思路】


什么是二八定律?


二八定律是说在任何一组东西中,最重要的只占一小部分,约20%。比如家店铺,卖的最多的商品数只占20%


什么是ABC分类法?


ABC分类方法是二八定律衍生出来的一种分类方法,由于它把对象分成A、B、C三类,所以叫做ABC分类法,也叫帕累托分析


ABC分类法计算步骤:


1)将分析对象由大到小排序

2)计算每一个对象及排在该对象之前的累计占比

3)将累计占比为0~60%的记为A类,60%~85%记为B类,85%以上记为C类


1. 解题思路


题目要求:找出每门课程A类和B类的学生,判断标准是累计占比,0~60%的记为A类,60%~85%记为B类;


所以,核心问题就是计算累计占比。


那么,什么是累计占比呢?


课程A的累计占比 = 课程A的累计成绩 / 课程A的总成绩


“课程总成绩”很好理解,也就是每门课程的所有学生的成绩总和。


“课程累计成绩”的定义是:


1)每门课程的学生成绩由大到小排序;


2)计算每一个学生及排在该学生之前的课程累计成绩。


举个例子,下表数学课程里按成绩从大到小排序是96、65、55。学号(S002)的数学课程累计成绩是96,学号(S001)的数学课程累计成绩是96+65=161,依此类推。


2. 课程累计成绩


累计问题要想到用窗口函数来解决。


select *,       sum(成绩) over (partition by 课程                        order by 成绩 desc                        rows between unbounded preceding and current row) as 课程累计成绩from 学生成绩表;

查询结果:


把这个SQL查询查询结果命名为子查询t1。


这里使用了窗口函数的rows between … and …用法。含义是对“起始行”至“终止行”的字段1求和。


sum(字段1) over (partition by 字段2                  order by 字段3                  rows between 起始行and 终止行)


对于这道题要求得“每一个学生及排在该学生之前的课程累计成绩”,所以,“起始行”就是每个窗口的第一行(unbounded preceding),“终止行”是当前行(current row)。



3. 课程总成绩


根据指标定义:课程A的累计占比 = 课程A的累计成绩 / 课程A的总成绩。


前面得到分子:每个课程的累计成绩。


还需要得到分母:每个课程的课程总成绩。


每个课程的课程总成绩,涉及到“每个”要想到用“汇总分析”,按课程分组(group by),汇总(求职成绩和sum)


select 课程,sum(成绩) as 课程总成绩from 学生成绩表group by 课程;


查询结果:


把这个SQL查询查询结果命名为子查询t2。


3.累计占比


根据指标定义:课程A的累计占比 = 课程A的累计成绩 / 课程A的总成绩。


为了方便计算,需要将上面两步得到结果汇总到一个表里。


将第1步得到的每个课程的累计成绩查询结果记为表t1,第2步得到的每个课程的总成绩查询结果记为表t2,进行多表联结。





select t1.学号,       t1.课程,       t1.成绩,       t1.课程累计成绩,       t2.课程总成绩,       t1.课程累计成绩/2.课程总成绩 as 累计成绩占比from  t1left join t2 on t1.课程 = t2.课程;


把第1、2步的子查询t1、t2代入上面的SQL语句,就得到了:


select t1.学号,       t1.课程,       t1.成绩,       t1.课程累计成绩,       t2.课程总成绩,       t1.课程累计成绩/t2.课程总成绩 as 累计成绩占比from (select *,       sum(成绩) over (partition by 课程                        order by 成绩 DESC                        rows between unbounded preceding and current row) as 课程累计成绩from 学生成绩表) as t1left join (select 课程,sum(成绩) as 课程总成绩from 学生成绩表group by 课程) as t2 on t1.课程 = t2.课程;


查询结果

把这个SQL查询查询结果命名为子查询t3


4.分类


题目要求的是:找出每门课程A类和B类的学生,判断标准是累计占比,0~60%的记为A类,60%~85%记为B类


select t3.学号,       t1.课程,       t1.成绩,       case when t3.累计成绩占比 > 0 and t3.累计成绩占比 <= 0.6 then 'A'                 t3.累计成绩占比 > 0.6 and t3.累计成绩占比 <= 0.85 then 'B'                 end as 类别from t3where t3.累计成绩占比 <= 0.85;


把第3步的子查询t3代入上面的SQL语句,就得到了:


select t3.学号,       t3.课程,       t3.成绩,       case when t3.累计成绩占比 > 0 and t3.累计成绩占比 <= 0.6 then 'A'            when t3.累计成绩占比 > 0.6 and t3.累计成绩占比 <= 0.85 then 'B'            end as 类别from (select t1.学号,       t1.课程,       t1.成绩,       t1.课程累计成绩,       t2.课程总成绩,       t1.课程累计成绩/t2.课程总成绩 as 累计成绩占比from (select *,       sum(成绩) over (partition by 课程                        order by 成绩 DESC                        rows between unbounded preceding and current row) as 课程累计成绩from 学生成绩表) as t1left join (select 课程,sum(成绩) as 课程总成绩from 学生成绩表group by 课程) as t2 on t1.课程 = t2.课程) as t3where t3.累计成绩占比 <= 0.85;

【本题考点】


1.考查对帕累托分析思路的理解;


2.考查对窗口函数的了解,以及灵活使用来解决业务问题;


3.考查对多表联结的了解。



 ⬇️点击「阅读原文」

 免费报名 数据分析训练营

原文作者:猴子数据分析;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2017-01-16

  • 博文量
    865
  • 访问量
    345570