SQL如何进行帕累托分析?(窗口函数、累计百分比分类)
帕累托分析法是指定决策的统计方法,包含按降序排序的列和表示累积总百分比的线条
【面试题】有一张“学生成绩表”,包含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. 课程累计成绩
累计问题要想到《跟猴子从零学会SQL》里讲过的用窗口函数来解决。
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 t1
left 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 t1
left 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 t3
where 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 t1
left join (
select 课程,sum(成绩) as 课程总成绩
from 学生成绩表
group by 课程
) as t2
on t1.课程 = t2.课程
) as t3
where t3.累计成绩占比 <= 0.85;
【本题考点】
1.考查对帕累托分析思路的理解;
2.考查对窗口函数的了解,以及灵活使用来解决业务问题;
3.考查对多表联结的了解。
第二种解决代码
select * from(
select c.`学号`,c.`课程`,c.`成绩`,
case when c.`课程累计成绩`/c.`课程总成绩` > 0 and c.`课程累计成绩`/c.`课程总成绩` <=0.6 then 'A'
when c.`课程累计成绩`/c.`课程总成绩`> 0.6 and c.`课程累计成绩`/c.`课程总成绩`<=0.85 then 'B'
end as '类别'
from (
select *,SUM(a.`成绩`) over (partition by a.`课程` ORDER BY a.`成绩` desc) as '课程累计成绩',SUM(a.`成绩`) over (partition by a.`课程`) as '课程总成绩'from `学生成绩表` as a ) as c) as d
where d.`类别` is not NULL
SQL如何进行帕累托分析?(窗口函数、累计百分比分类)相关推荐
- 笔记-高项案例题-2019年下-质量管理-帕累托分析
2019年下半年信息系统项目管理师考试下午真题 这一题没拿到高分,难怪当年不过了. [说明] 2019年3月某公司中标当地轨道交通的车载广播系统项目,主要为地铁列车提供车载广播.报警.对讲及电子地图系 ...
- 数据特征分析-帕累托分析
帕累托分析(贡献度分析):即二八定律 目的:通过二八原则寻找属于20%的关键决定性因素. 随机生成数据 df = pd.DataFrame(np.random.randn(10)*1000+3000, ...
- Powerbi实现帕累托分析
完整文档 主要实现功能: 1.任意选择城市数量 2.任意选择时间区间 3.除参与排名的城市,其他城市用[其他]代替,且颜色标注出来 实现效果: ![GIF 2022-3-17 14-27-06.gif ...
- Power BI应用案例:销售帕累托分析(28法则)
一.应用背景 帕累托法则往往称为二八原理,即百分之八十的问题是百分之二十的原因所造成的.帕累托图在项目管理中主要用来找出产生大多数问题的关键原因,用来解决大多数问题.本文利用Power BI进行帕累托 ...
- Power BI产品帕累托分析
效果图一: 说明: 1.x轴为每个产品的销售金额,按照从大到小排序 2.y轴为这些产品累积的销售金额占比,也就是 到产品的累积销售金额 除以 所有产品总的销售金额 3.红色框部分表示,累积销售金额占比 ...
- 10.Excel数据特征分析-帕累托分析法
文章目录 1.什么是帕累托分析 2.帕累托分析法案例 3.数据透视表与帕累托分析结合具体步骤 3.1数据透视表建立 3.2 帕累托图的建立 3.3 调整帕累托图 3.3.1调整坐标轴 3.3.2 调整 ...
- 数据特征分析之帕累托分析以及python实现
帕累托分析(贡献度分析) → 帕累托法则:20/80定律 "原因和结果.投入和产出.努力和报酬之间本来存在着无法解释的不平衡.一般来说,投入和努力可以分为两种不同的类型: 多数,它们只能造成 ...
- python数据分析之帕累托分析
帕累托分析 帕累托图在概念上与帕累托法则有关.帕累托法则认为,相对少量的原因通常造成大多数的问题或缺陷.该法则通常称为80/20原则,即80%的问题是由20%的原因导致的.帕累托图也用于汇总各种类型的 ...
- 帕累托分析中的累计优化
帕累托分析又称ABC分析,也许有些人是第一次听到这样的叫法,实际它就在我们的身边.比如世界上百分之九十的财富掌握在十个人手里:头部商品占了公司80%的营业额:项目中应该把80%的时间投入到那80%重要 ...
最新文章
- ViT(vision transformer)原理快速入门
- 前端一HTML:十六: 权重有关的练习
- vue+springboot-前台怎么回显本地文件夹下的图片
- 【效率】推荐10个堪称神器的网站!
- 浏览器中的JavaFX
- python 接收邮件服务器地址_Python 用IMAP接收邮件
- .propertie文件注释
- 集福宝 支付宝2021年最新一款集福神器
- BZOJ 3038: 上帝造题的七分钟2【线段树区间开方问题】
- java count rows_Java统计个人编写的Java文件个数及代码行数
- c#学习-base和this在构造函数中的应用
- hive explain 源码分析
- java 生成ai矢量图_(针对新手)AI将位图图标转换为矢量图方法
- C#注入DLL-C#注入器
- 桌面上计算机快捷方式打不开,桌面快捷方式打不开解决步骤
- 判断一个数能否同时被3和5整除
- 查询给定区域内曲面平均高程
- 前端速成:双月Java之旅(week3)_day2
- 新加坡企业是怎么做实名认证的?
- 利用python做词频统计
热门文章
- 甘肃300件文物现古丝路交通 穿越古今展视听新体验
- 2022双十一买什么好?行家推荐四大最值得入手的数码好物
- Matlab plot画图 坐标字体、字号、范围、间隔等的设置
- 重温Python基础——列表
- 实例:用C#.NET手把手教你做微信公众号开发(20)--使用微信支付线上收款:jsapi方式
- Android 9.0 SystemUI 锁屏界面禁止状态栏下拉
- Python之OpenGL笔记(17):键盘鼠标控制摄像机移动旋转
- 每日学英语20040722
- script 脚本标签中 defer 和 async (延缓 和 异步)
- 关于互联网的十个Fun Fact——第一条就开车了...