首页 > 其他分享 >窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器

窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器

时间:2023-08-22 09:23:47浏览次数:49  
标签:数据分析 窗口 cate UNBOUNDED record cost 玩转 date 揭秘

上一篇文章《如何用窗口函数实现排名计算》中小编为大家介绍了窗口函数在排名计算场景中的应用,但实际上窗口函数除了可以进行单行计算,还可以在每行上打开一个指定大小的计算窗口,这个计算窗口可以由SQL中的语句具体指定,大到整个分区作用域,小到当前行指定的某个偏移行(比如 当前行的上一行、下一行,整个计算窗口被称作 frame)。今天小编就为大家介绍窗口函数在累计分析场景中的应用。

需要注意的是,如果您的数据库版本低于以下版本,将无法使用文章中使用到的窗口函数。

1.Mysql (>=8.0)

2. PostgreSQL(>=11)
3. SQL Server(>=2012)
4. Oracle(>=8i)
5. SQLite(>=3.28.0)

需求背景

和上一篇文章一样,为了让大家更好的理解,我将以工厂的耗材损耗数据作为查询条件背景:假设现在有某个工厂刚刚完成了一次耗材的加工,在加工的过程中记录了耗材分类,每日的记录时间、每日的耗材耗损数和当月的月初耗材供给量,如下表所示:

现在这家公司的老板想看一下:

1. 各个耗材的每日累计损耗量。

2. 各个耗材的当月每日余量。

3. 各个耗材的每月累计消耗占比。

查询各个耗材的每日累计损耗量

执行如下的SQL语句。

select cate,record_date,init_value,SUM(cost) over(partition by cate,MONTH(record_date) order by record_date ) as cm_cost

from material_data md;

可以看到,通过上述 SQL 查询就已经得到了每个分类每月的每日累计耗损量。这里为大家解释下SQL中的重点部分:

SUM(cost) over(partition by cate,MONTH(record_date) order by record_date );

在上一篇文章中我们介绍过,partition by 指定了计算分区, order by 决定了计算的行顺序, 那累计效果又是谁来完成的呢, 这里小编把刚刚的 SQL 稍微改造一下就会更清晰。

select cate,record_date,init_value,SUM(cost) over(partition by cate,MONTH(record_date) order by record_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) as cm_cost

from material_data md;

改造后的SQL和最开始的查询SQL达成的效果是一致的, 我们可以看到改造SQL在 order by 后加了一段代码:

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

小编为大家拆解一下这个代码,第一个 ROWS 表示接下来的 Frame 窗口指定为行模式, BETWEEN 关键字表示接下来的语句效果是指定 窗口范围, UNBOUNDED 和PRECEDING 是两个关键字的组合,前者表示 该计算窗口在 ↑ 方向的边界为最顶部,对应到 partion by 分区中 6 月份的计算域,UNBOUNDED PRECEDING 表示6月份每一行的窗口上界为 order by record_date 顺序下的最小值,即 2023/06/01号的记录, 同样的 接下来的 AND CURRENT ROW 则指定了计算frame 窗口的 ↓ 边界为当前行。 最后我们重新梳理下这个计算窗口, 在每月每个分类的计算分区下,每一行的计算窗口为 从本月的最小日期 到当前行的所有记录,,联系到最开始 SUM(cost) 聚合就能够理解 为什么这条 SQL 能计算出对应的累计值了。

这里可以扩展说明一下,确定计算窗口大小的关键字 除了UNBOUNDED PRECEDING和CURRENT ROW 之外还有 UNBOUNDED FOLLOWING, 如果 UNBOUNDED PRECEDING 表示上边界的顶部, 那 UNBOUNDED FOLLOWING 就表示下边界的底部。所以如果指定计算窗口为 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING, 则表示在整个分区计算域中进行聚合运算。另外, UNBOUNDED 其实是非必须的, 这里可以替换为任意数字表示 针对当前行的偏移行数。比如 1 PRECEDING 表示 当前行的上一行, 1 FOLLOWING 表示当前行的下一行, 我们通过指定计算窗口为 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING 就能计算 每一行从上一行到下一行之间这三行的累计值。至于说 CURRENT ROW 则指定为当前行,这也是为什么能做累计求和的关键。
类似的,MAX()、AVG() 等聚合函数也适用于以上的规则, 我们可以在每一行的指定窗口内来计算最大值,平均值等聚合值。

查询各个耗材的当月每日余量

查询Sql:

select

cate,

record_date,

init_value,

init_value - SUM(cost) over(partition by cate,MONTH(record_date) order by record_date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) as material_num

from material_data md;

也可以简写为

select

cate,

record_date,

init_value,

init_value - SUM(cost) over(partition by cate,MONTH(record_date) order by record_date ) as material_num

from material_data md;

查询各个耗材的每月累计消耗占比

select

md.cate,

record_date,

init_value,

cost/ sum(cost) over(partition by cate,MONTH(record_date) ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as cm_cost

from material_data md

同理,可以简写为:

select

md.cate,

record_date,

init_value,

cost/ sum(cost) over(partition by cate,MONTH(record_date)) as cm_cost

from material_data md

接着就可以根据每天的消耗量占比,来挖掘实际业务场景, 对异常消耗量数据进行对应跟踪。


总结

累计运算也是窗口函数在业务场景中使用得最频繁得一个场景,尤其是销售业务累计排名,业务器材每日消耗程度, 每日余量警报等场景都会用到, 希望能对各位有所帮助。而关于 frame计算窗口得灵活调整还有更多丰富特性,后续(第三篇)还会为大家介绍偏移计算场景。

扩展链接:

如何快速实现多人协同编辑?

Excel中自定义手写签名

高级SQL分析函数-窗口函数(1)- 排名计算

标签:数据分析,窗口,cate,UNBOUNDED,record,cost,玩转,date,揭秘
From: https://www.cnblogs.com/powertoolsteam/p/17646740.html

相关文章

  • Excel数据分析1 导入+清洗
    数据分析流程导入——清洗(70%时间)——处理——展现导入数据避坑指南1.表格导入:谨慎选择导入格式2.非表格导入:多技巧综合灵活运用快速复制方法,点击起始点,(拖动页面滚轮条),shift点击结束点,即可选中中间区域 清洗此数据首先倒退思维一套房源应该在EXCEL中为一行,那么我们需......
  • 想用低代码平台?不需要从零开始,AstroZero了解一下玩转低代码【玩转低代码】
    低代码,从零开始?对低代码的犹豫点?春风一夜万树开,有一阵,好似大家都在做中后台,都在研究或实现低代码平台。见面聊天在讨论,网上文章也在讲。但是我为什么对从零开始打了一个问号呢?按说我这种喜欢折腾的开发者,怎么也要搞一套。不止我,我的团队,曾有过搭建低代码平台的计划。当时计划集中一......
  • 精读 classnames源码,解读重点功能的实现【玩转源码】
    前言本文主要讲解classnames相关的知识点。对classnames源码,按照功能模块进行解读。尤其对于源码中关键代码从实现层面做了解读。在总结过程中,对CSS-in-JS写法有了不同的想法,结合大佬的文章,将想法记录在了文末。classnames的原理源码目录功能模块目录结构classnames┣......
  • 揭秘知识付费软件排名:兔知云课堂引领私域知识付费新潮流
    在当今数字化时代,知识付费已经成为越来越多人分享专业知识、寻找创业机会的热门方式。许多人都在探索适用于自己的知识付费小程序。今天,我将会为您分享一个基于产品评分和综合热度的知识付费软件排名,其中也会涵盖兔知云课堂,这是一款低成本的音视频课程点播系统,专为私域场景打造的......
  • IT行业招聘数据分析与岗位推荐系统-计算机毕业设计源码+LW文档
    内容摘要随着社会经济的快速发展,人们的生活水平得到了显著提高,但随之而来的社会问题也越来越多。其中最为显著的就是就业问题。为此,招聘信息的展示也变得越来越为重要。但是在大量的招聘信息中,人们在提取自己最想要的信息时变得不那么容易,对于应聘者也是如此。本系统通过对网络爬虫......
  • 金融行业招聘数据分析系统的设计与实现-计算机毕业设计源码+LW文档
    摘要随着社会经济的快速发展,人们的生活水平得到了显著提高,但随之而来的社会问题也越来越多。其中最为显著的就是就业问题。为此,招聘信息的展示也变得越来越为重要。但是在大量的招聘信息中,人们在提取自己最想要的信息时变得不那么容易,对于应聘者也是如此。本系统通过对网络爬虫的......
  • 一文玩转Apipost
    前言Apipost是一款支持RESTfulAPI、SOAPAPI、GraphQLAPI等多种API类型,支持HTTPS、WebSocket、gRPC多种通信协议的API调试工具。除此之外,Apipost还提供了自动化测试、团队协作、等多种功能。这些丰富的功能简化了工作流程,提高了研发效率,这也让Apipost成为开发人员首选的API......
  • 一文玩转Apipost
    前言 Apipost是一款支持RESTfulAPI、SOAPAPI、GraphQLAPI等多种API类型,支持HTTPS、WebSocket、gRPC多种通信协议的API调试工具。除此之外,Apipost还提供了自动化测试、团队协作、等多种功能。这些丰富的功能简化了工作流程,提高了研发效率,这也让Apipost成为开发人员首选的A......
  • 搜文本搜位置搜图片,1小时玩转Elasticsearch
    加入Elasticsearch训练营,从全文检索到向量检索,搭建高频业务场景,构建进阶向量检索应用。带你拓展技术视野,晋升Elasticsearch搜索实战派。以下为训练营的参营指南,请您仔细阅读便于更顺利地进行训练营打卡。活动地址活动地址:<https://developer.aliyun.com/trainingcamp/53a2ca29e......
  • formDataToJSON 抽丝剥茧 formData 与 Object 的转换【玩转源码】
    前言通过axios源码阅读,实现formDataToJSON抽丝剥茧formData与Object的转换,接下来详细分享整个过程。formDataToJSON抽丝剥茧formData与Object的转换FormData对象FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据。FormData对象主要用于发送表单数......