窗口函数:实现组内百分比、累计值、累计百分比
0 前言
最近做数据分析,需要求每一组内的元素的百分比以及累计百分比,实在想不出怎么使用sql实现,就先将数据导出,然后使用excel计算。趁着夜深人静的时候,思维敏捷,尝试一下使用窗口函数实现一下,天佑我也,尝试了几次,最终成功了,这里分享一下,也算抛砖引玉,如果有更好的方法,可以共同交流一下。
1 需求描述
还是以往风格,直接用表格描述需求,虚构一些数据,某公司在每个地区不同月份的销售额如下:
我们需要在表1的后面加上3列:分别是组内百分比、组内累计值和组内累计百分比。
表 1 | ||
地区 | 年月 | 销售额 |
A | 2018/04 | 1000000 |
A | 2018/05 | 2000000 |
A | 2018/06 | 1500000 |
B | 2018/04 | 1000000 |
B | 2018/05 | 1600000 |
B | 2018/06 | 2000000 |
B | 2018/07 | 1500000 |
表 2 | |||||
地区 | 年月 | 销售额 | 组内百分比 | 组内累积值 | 组内累积百分比 |
A | 2018/04 | 1000000 | 22.22% | 1000000 | 22.22% |
A | 2018/05 | 2000000 | 44.44% | 3000000 | 66.67% |
A | 2018/06 | 1500000 | 33.33% | 4500000 | 100.00% |
B | 2018/04 | 1000000 | 16.39% | 1000000 | 16.39% |
B | 2018/05 | 1600000 | 26.23% | 2600000 | 42.62% |
B | 2018/06 | 2000000 | 32.79% | 4600000 | 75.41% |
B | 2018/07 | 1500000 | 24.59% | 6100000 | 100.00% |
2 需求实现
可以看出A地区3个月的销售总额为4500000,那么组内百分比分别为1000000/4500000、2000000/4500000和1500000/4500000,同理可以得到B地区的,但是在sql中怎么计算A地区和B地区的销售总额呢?可能你会想到group by一下地区,然后对每个地区销售额求和,可以求出来,但是个人觉得那样就比较繁琐了,写sql代码应该是一种享受的过程。这里我们使用窗口函数实现我们的需求:及加入一个字段sum(saleroom) over(partition by area order by area)即可。
组内累计和和组内累计百分比比较棘手,尝试了一些办法,分享一些认为比较简单的代码。
2.1 实现代码
为了呈现百分比的结果,我们使用round()函数以及concat()函数对小数结果进行处理,当然如果觉得输入结果为字符型,你也可以使用cast()函数进行转化格式:
sum(saleroom) over(partition by area order by date) ---求组内累计值
sum(saleroom) over(partition by area order by area) ---求组内总计值select *,sum(saleroom) over(partition by area order by date) aggregate_value,sum(saleroom) over(partition by area order by area) total_vale
from WN_table1;
运行结果见表3:
表 3 组内累计值和组内总计 | ||||
area | date | saleroom | aggregate_value | total_value |
A | 2018/04 | 1000000 | 1000000 | 4500000 |
A | 2018/05 | 2000000 | 3000000 | 4500000 |
A | 2018/06 | 1500000 | 4500000 | 4500000 |
B | 2018/04 | 1000000 | 1000000 | 6100000 |
B | 2018/05 | 1600000 | 2600000 | 6100000 |
B | 2018/06 | 2000000 | 4600000 | 6100000 |
B | 2018/07 | 1500000 | 6100000 | 6100000 |
所以,
组内百分比= saleroom / total_value
累计百分比 = aggregate_value/total_value
故得到表2格式的代码如下:
select area, date, saleroom, concat(round((saleroom /total_value)*100,2), '%') percent,aggregate_value,concat(round((aggregate_value/total_value)*100,2), '%') aggregate_percent
from(select *,sum(saleroom) over(partition by area order by date) aggregate_value,sum(saleroom) over(partition by area order by area) total_valuefrom WN_table1) t
3 总结
本文分享使用窗口函数实现一些复杂的需求,日后会陆续写一些有关窗口函数的内容,有时间的话,将窗口函数知识系列分享一些下,晚安,everyone。
窗口函数:实现组内百分比、累计值、累计百分比相关推荐
- 【SQL】窗口函数:求数据的整体百分比、整体累计值,组内累计值和组内累计百分比...
〇.概述 1.所需资料 窗口函数实现组内百分比.累计值.累计百分比:https://blog.csdn.net/weixin_39751959/article/details/88828922 2.背 ...
- Tableau函数:实现数值累计值
工作中经常需要看截至到当前时间完成情况,比如以自带的"示例–超市"中的销售额为例,各年度的总销售额为多少?各季度完成销售额多少?累计到二季度完成销售额多少?以自带的"示例 ...
- excel-vba组内离均差
Sub 组内离均差() ' ' 组内平均值 Macro ' 宏由 zzh_my@163.com 录制,时间: 2015/11/18 ' '点名 初始化时间(s) 测量时刻 次序号 平 ...
- oracle中怎么用累计,oracle实现累加,累计百分比计算
最近做数据分析,需要用到累加功能,发现强大的oracle还真有,用over(order by field) 例子: 数据表中最后一列就是累加的效果 累加sql: select t.acc_pedal_ ...
- oracle实现累加,累计百分比计算
最近做数据分析,需要用到累加功能,发现强大的oracle还真有,用over(order by field) 例子: 数据表中最后一列就是累加的效果 累加sql: select t.acc_pedal_ ...
- SQL窗口函数-截止至某天的累计值
窗口函数不仅能实现排序,还能实现累计功能,作用强大. 下面的例子使用窗口函数实现累计功能,看似复杂,但是其实不难,小白也能秒懂! ------------ 我是例子分界线 -------------- ...
- sqlserver 累计数量_用sqlserver查询累计值
如何用SQL Server查询累计值 作者: Builder.com.cn 2006-12-11 05:34 PM 有这样一个要求,它要创建一个SQL Server查询,其中包括基于事件时刻的累计值. ...
- 使用SQL和Pandas计算累计百分比
本文目录: 数据准备 MySQL 计算累计百分比 1.不分组情况 2.分组情况 Hive SQL计算累计百分比 1.不分组情况 2.分组情况 pandas计算累计百分比 1.不分组情况 cumsum函 ...
- MySQL查询累计值的方法
假设有借贷记录表,字段有借入,贷出,以及记账日期.表中记录如下所示: 现在想统计某一天,或者某一时间段内,每天的借贷累总额,以及历史累计总额,比如,2021-10-07日的借贷总额是1100,1000 ...
最新文章
- android studio字符串转整型,Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)...
- MyGeneration代码生成工具
- Android 识别图片二维码
- linux awk if 多个条件,linux shell awk 流程控制语句(if,for,while,do)详细介绍
- 底层实现_Java AOP的底层实现原理
- 干货!无需任何工具,实测macOS双开微信客户端
- 漫步ASP.NET MVC的处理管线
- KEIL C51软件安装
- 软件工程学习笔记(三)~顺序图模型
- matlab 单元数组输入,Matlab 单元数组
- linux 备份 网络配置,如何备份已经配置好的虚拟机linux系统的网络..._网络编辑_帮考网...
- 机器学习数学基础十:相关分析
- 【Educoder作业】※网页抓取及信息提取
- 《Globally and locally consistent image completion》图像修复论文解读
- 泰拉瑞亚服务器一直显示什么,《泰拉瑞亚》Steam联机总是掉?教你一个稳定联机方法...
- 三本可爱小表妹,面试小米Java技术岗经验分享(已拿offer)
- Windows与Linux的MYSQL UDF提权分析
- 花滑三周连跳_阿克塞尔三周PK四周跳 花滑女单正式进入新纪元
- js中获取当前点击的li标签以及li标签中a标签的id
- ZOJ 3591 Nim (NIM博弈+统计
热门文章
- 关于相对论的一个猜想——二维空间理论
- 校企勾结?京东被指压榨实习生:不结薪资、暴力对待、校方威胁...
- Android 智能遥控器源码,基于Android手机的智能遥控器设计
- Cesium 中的离屏渲染
- 曲速未来 发布:新基建下,区块链将急速发展
- Redis 在spring 中的应用
- 解决 HBuilderX 控制台报libpng warning: iCCP: cHRM chunk does not match sRGB的问题
- 单招考计算机一般考什么科目,单招考试考什么内容 单招都考什么科目
- springboot项目中favicon.ico的异常处理
- python绘制等值线图_Python/Matplotlib双线性插值等值线图