SQL进阶技巧:如何计算复合增长率?

目录

0 场景描述

1 数据准备

2 问题分析

3 小结


0 场景描述

复合增长率是第N期的数据除以第一期的基准数据,然后开N-1次方再减去1得到的结果。假如2018年的产品销售额为10000,2019年的产品销售额为12500,2020年的产品销售额为15000(销售额单位省略,下同)​。那么这两年的复合增长率的计算方式如下

复合增长率的计算公式如下:

复合增长率 = (最终值 / 初始值)^( 1 / n) - 1

其中:

  • 最终值是指期末的数值;
  • 初始值是指起始的数值;
  • n 时间段数量是指经过 n 个时间段的增长所到达的值。

举例来说,假设某项指标在起始时刻(一月份)为 100,经过 6 个月(到达七月份)的增长,最终值为 200,则可以按照以下步骤计算月均复合增长率:

月均复合增长率 = ( (200 / 100)^(1 / (7-1)) -1) * 100%

这样就得到了某指标经过 6 个月的整体增长率(复合增长率) 为12.25%

 在计算月均或年均复合增长率时,需要使用连续的起始值和结束值来进行计算。假设有 n 个连续的月份数据,那么起始值到结束值的时间跨度为 n-1 个月,只计算后续的增长情况。

以年度为单位计算的复合增长率被称为年均复合增长率,以月度为单位计算的复合增长率被称为月均复合增长率。查询自2018年1月以来不同产品的月均销售额复合增长率?

1 数据准备

-- 创建销量表sales_monthly
-- product表示产品名称,ym表示年月,amount表示销售金额(元)
CREATE TABLE sales_monthly(product varchar2(20), ym varchar2(6), amount decimal(10, 2));
-- 生成测试数据
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201801',10159.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201802',10211.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201803',10247.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201804',10376.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201805',10400.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201806',10565.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201807',10613.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201808',10696.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201809',10751.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201810',10842.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201811',10900.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201812',10972.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201901',11155.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201902',11202.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201903',11260.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201904',11341.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201905',11459.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('苹果','201906',11560.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201801',10138.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201802',10194.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201803',10328.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201804',10322.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201805',10481.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201806',10502.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201807',10589.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201808',10681.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201809',10798.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201810',10829.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201811',10913.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201812',11056.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201901',11161.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201902',11173.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201903',11288.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201904',11408.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201905',11469.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('香蕉','201906',11528.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201801',10154.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201802',10183.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201803',10245.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201804',10325.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201805',10465.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201806',10505.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201807',10578.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201808',10680.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201809',10788.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201810',10838.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201811',10942.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201812',10988.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201901',11099.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201902',11181.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201903',11302.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201904',11327.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201905',11423.00);
INSERT INTO sales_monthly (product,ym,amount) VALUES ('桔子','201906',11524.00);

2 问题分析

步骤1:计算初始值并生成连续序列值

       select product,ym,total_amount,first_value(total_amount) over (partition by product order by ym) first_total_amount,row_number() over (partition by product order by ym)              rnfrom (select product,ym,sum(amount) total_amountfrom sales_monthlygroup by product, ym) t1
PRODUCT	YM	TOTAL_AMOUNT	FIRST_TOTAL_AMOUNT	RN
桔子	201801	10154	10154	1
桔子	201802	10183	10154	2
桔子	201803	10245	10154	3
桔子	201804	10325	10154	4
桔子	201805	10465	10154	5
桔子	201806	10505	10154	6
桔子	201807	10578	10154	7
桔子	201808	10680	10154	8
桔子	201809	10788	10154	9
桔子	201810	10838	10154	10
桔子	201811	10942	10154	11
桔子	201812	10988	10154	12
桔子	201901	11099	10154	13
桔子	201902	11181	10154	14
桔子	201903	11302	10154	15
桔子	201904	11327	10154	16
桔子	201905	11423	10154	17
桔子	201906	11524	10154	18
苹果	201801	10159	10159	1
苹果	201802	10211	10159	2
苹果	201803	10247	10159	3
苹果	201804	10376	10159	4
苹果	201805	10400	10159	5
苹果	201806	10565	10159	6
苹果	201807	10613	10159	7
苹果	201808	10696	10159	8
苹果	201809	10751	10159	9
苹果	201810	10842	10159	10
苹果	201811	10900	10159	11
苹果	201812	10972	10159	12
苹果	201901	11155	10159	13
苹果	201902	11202	10159	14
苹果	201903	11260	10159	15
苹果	201904	11341	10159	16
苹果	201905	11459	10159	17
苹果	201906	11560	10159	18
香蕉	201801	10138	10138	1
香蕉	201802	10194	10138	2
香蕉	201803	10328	10138	3
香蕉	201804	10322	10138	4
香蕉	201805	10481	10138	5
香蕉	201806	10502	10138	6
香蕉	201807	10589	10138	7
香蕉	201808	10681	10138	8
香蕉	201809	10798	10138	9
香蕉	201810	10829	10138	10
香蕉	201811	10913	10138	11
香蕉	201812	11056	10138	12
香蕉	201901	11161	10138	13
香蕉	201902	11173	10138	14
香蕉	201903	11288	10138	15
香蕉	201904	11408	10138	16
香蕉	201905	11469	10138	17
香蕉	201906	11528	10138	18

步骤2:利用公式计算月均复合增长率 

select product,ym,first_total_amount,total_amount,concat(cast(nvl((power(total_amount / first_total_amount, 1 / nullif((rn - 1), 0)) - 1) * 100,0.00) as decimal(10, 2)),'%') month_avg_compound_growth_rate
from (select product,ym,total_amount,first_value(total_amount) over (partition by product order by ym) first_total_amount,row_number() over (partition by product order by ym)              rnfrom (select product,ym,sum(amount) total_amountfrom sales_monthlygroup by product, ym) t1) t2;
PRODUCT	YM	FIRST_TOTAL_AMOUNT	TOTAL_AMOUNT	MONTH_AVG_COMPOUND_GROWTH_RATE
桔子	201801	10154	10154	0%
桔子	201802	10154	10183	.29%
桔子	201803	10154	10245	.45%
桔子	201804	10154	10325	.56%
桔子	201805	10154	10465	.76%
桔子	201806	10154	10505	.68%
桔子	201807	10154	10578	.68%
桔子	201808	10154	10680	.72%
桔子	201809	10154	10788	.76%
桔子	201810	10154	10838	.73%
桔子	201811	10154	10942	.75%
桔子	201812	10154	10988	.72%
桔子	201901	10154	11099	.74%
桔子	201902	10154	11181	.74%
桔子	201903	10154	11302	.77%
桔子	201904	10154	11327	.73%
桔子	201905	10154	11423	.74%
桔子	201906	10154	11524	.75%
苹果	201801	10159	10159	0%
苹果	201802	10159	10211	.51%
苹果	201803	10159	10247	.43%
苹果	201804	10159	10376	.71%
苹果	201805	10159	10400	.59%
苹果	201806	10159	10565	.79%
苹果	201807	10159	10613	.73%
苹果	201808	10159	10696	.74%
苹果	201809	10159	10751	.71%
苹果	201810	10159	10842	.73%
苹果	201811	10159	10900	.71%
苹果	201812	10159	10972	.7%
苹果	201901	10159	11155	.78%
苹果	201902	10159	11202	.75%
苹果	201903	10159	11260	.74%
苹果	201904	10159	11341	.74%
苹果	201905	10159	11459	.76%
苹果	201906	10159	11560	.76%
香蕉	201801	10138	10138	0%
香蕉	201802	10138	10194	.55%
香蕉	201803	10138	10328	.93%
香蕉	201804	10138	10322	.6%
香蕉	201805	10138	10481	.84%
香蕉	201806	10138	10502	.71%
香蕉	201807	10138	10589	.73%
香蕉	201808	10138	10681	.75%
香蕉	201809	10138	10798	.79%
香蕉	201810	10138	10829	.74%
香蕉	201811	10138	10913	.74%
香蕉	201812	10138	11056	.79%
香蕉	201901	10138	11161	.8%
香蕉	201902	10138	11173	.75%
香蕉	201903	10138	11288	.77%
香蕉	201904	10138	11408	.79%
香蕉	201905	10138	11469	.77%
香蕉	201906	10138	11528	.76%

3 小结

     本文介绍了复合增长率的概念及计算公式,并提供了SQL代码示例来计算商品的月度复合增长率。复合增长率是连续时间段内平均增长的速率。

    复合增长率是一个时间序列概念。当考虑一个资产或经济指标的长期增长时,不能仅看其绝对增长值,因为不同时间段内的增长速度可能会有所不同。复合增长率就是用来解决这个问题的一个很好的工具。它考虑了从过去到现在,再到预测未来的增长趋势。计算复合增长率时,通常会考虑多个时间点的数据,然后计算这些时间段内增长率的平均值。通过这种方式,我们可以得到一个相对稳定的增长指标,从而更好地预测未来的发展趋势。在金融市场、企业决策以及宏观经济分析中,复合增长率是一个非常重要的指标。通过了解和掌握复合增长率的概念和计算方法,投资者和企业决策者可以更好地把握市场动态,做出更为明智的决策。

 

如果您觉得本文还不错,对你有帮助,那么不妨可以关注一下我的数字化建设实践之路专栏,这里的内容会更精彩。

专栏 原价99,现在活动价59.9,按照阶梯式增长,还差5个人上升到69.9,最终恢复到原价

专栏优势:
(1)一次收费持续更新。

(2)实战中总结的SQL技巧,帮助SQLBOY 在SQL语言上有质的飞越,无论你应对业务难题及面试都会游刃有余【全网唯一讲SQL实战技巧,方法独特

(3)实战中数仓建模技巧总结,让你认识不一样的数仓。【数据建模+业务建模,不一样的认知体系】(如果只懂数据建模而不懂业务建模,数仓体系认知是不全面的

(4)数字化建设当中遇到难题解决思路及问题思考。

我的专栏具体链接如下:

数字化建设通关指南_莫叫石榴姐的博客-CSDN博客

https://blog.csdn.net/godlovedaniel/category_12706766.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/465710.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-docx -- 读取word图片

文章目录 概念介绍形状对象读取图片自定义图形 概念介绍 从概念上来讲,word文档分为两层,一个文本层,一个绘画层; 文本层,从上到下,从左到右,流式排版,本页填满则开启新页面&#…

Python数据可视化seaborn

产品经理在做数据分析时可能需要通过可视化来分析。seaborn官网 1. relplot 散点图 https://seaborn.pydata.org/examples/scatterplot_sizes.html import pandas as pd import seaborn as sns df pd.DataFrame({x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],y: [8, 6, 7, 8, 4, 6,…

释放专利力量:Patently 如何利用向量搜索和 NLP 简化协作

作者:来自 Elastic Matt Scourfield, Andrew Crothers, Brian Lambert 组织依靠知识产权 (IP) 来推动创新、保持竞争优势并创造收入来源。对于希望将新产品推向市场的公司来说,弄清楚谁拥有哪些专利是一项必不可少的能力。搜索数百万项专利可能既困难又耗…

协议栈攻击分类(CISP-PTE笔记)

CISP-PTE笔记 协议栈攻击分类 1.协议栈自身的脆弱性 ​ 1)缺乏数据源验证机制 ​ 2)缺乏完整性验证机制 ​ 3)缺乏机密性验证机制 2.网络接口层攻击 3.网络层攻击 4.应用层攻击 网络攻击的基本模式 被动威胁(不影响通信双…

SpringBoot3集成Junit5

目录 1. 确保项目中包含相关依赖2. 配置JUnit 53. 编写测试类4、Junit5 新增特性4.1 注解4.2 断言4.3 嵌套测试4.4 总结 在Spring Boot 3中集成JUnit 5的步骤相对简单。以下是你可以按照的步骤: 1. 确保项目中包含相关依赖 首先,确保你的pom.xml文件中…

智慧城市智慧城市项目方案-大数据平台建设技术方案(原件Word)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障…

算法练习:904. 水果成篮

题目链接:904. 水果成篮。 题目意思就是可以选取两个种类的水果不能超过两个种类,该种类个数没有限制, 但是一旦超过两个种类的水果就要停止计数。 示例中数组编号就是就是种类,就是不能出现三个不同编号的数。 1.暴力解法&…

wincc中全局脚本C(c语言脚本)的研究和解密

文章目录 前言一、分析 前言 很多时候我们在wincc中写全局脚本时会为自己的脚本添加密码,但很久很久以后再想修改密码忘记了怎么办呢。 一、分析 经过分析编码有了下面成功 ![请添加图片描述](https://i-blog.csdnimg.cn/direct/33baf91a49da410e82f16b4fbd746c48…

Java+控制台 商城销售系统

Java控制台 商城销售系统 一、系统介绍二、功能展示1.系统登陆2.二维数组实现商城销售系统3.类集实现商城销售系统 四、其它1.其他系统实现 一、系统介绍 实现一个xx商城销售系统的登录功能: 1))打开系统,给出欢迎信息。 2)将用户名和密码定…

微服务中常用分布式锁原理及执行流程

1.什么是分布式锁 分布式锁是一种在分布式系统环境下实现的锁机制,它主要用于解决,多个分布式节点之间对共享资源的互斥访问问题,确保在分布式系统中,即使存在有多个不同节点上的进程或线程,同一时刻也只有一个节点可…

A15基于Spring Boot的宠物爱心组织管理系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

测试自动化如何和业务流程结合?

测试自动化框架固然重要,但是最终自动化的目的都是为了业务服务的。 那测试自动化如何对业务流程产生积极影响? 业务流程的重要性 测试自动化项目并非孤立存在,其生命周期与被测试的应用程序紧密相关。项目的价值在于被整个开发团队所使用&a…

AI - 使用LangChain请求LLM结构化生成内容

AI - 使用LangChain请求LLM结构化生成内容 基于深度学习的大型语言模型(LLM)不仅可以生成文本,还可以帮助我们完成许多复杂任务,如自动化客服、内容创作和数据分析。然而,如何从这些模型中结构化地获取输出&#xff0c…

使用GPT-SoVITS训练语音模型

1.项目演示 阅读单句话 1725352713141 读古诗 1725353700203 2.项目环境 开发环境:linux 机器配置如下:实际使用率百分之二十几, 3.开发步骤 1.首先是准备数据集,要求是wav格式,一到两个小时即可, 2.…

UML的另一个主角——用例图

顺序图和类图已经出过单集,本贴要分享的是用例图。 类图https://blog.csdn.net/jsl123x/article/details/143526286?spm1001.2014.3001.5501顺序图https://jslhyh32.blog.csdn.net/article/details/134350587 目录 一.系统 二.参与者 1.主要参与者 2.次要参与…

set和map的使用

目录 1.关联式容器 2.键值对 3.set 3.1set的模版参数列表 3.2对set的修改 3.2.1insert 3.2.2 erase 3.2.3clear 3.2.4swap 3.2.5 find 3.3set的迭代器 3.4set的容量 4.map 4.1对map的修改 4.1.1insert 4.1.2erase 4.1.3swap 4.1.4clear 4.2map的迭代器 4.3opera…

【5.10】指针算法-快慢指针将有序链表转二叉搜索树

一、题目 给定一个单链表,其中的 元素按升序排序 ,将其转换为 高度平衡的二叉搜索树 。 本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表: [ -10 , -3 , 0 , …

dns服务器配置

主服务器 1.挂载点 mount /dev/sr0 /mnt 2.防火墙关闭 systemctl stop firewalld setenforce 0 3.下载bind软件 dnf install bind -y 4.进行正向解析配置 vim /etc/named.conf options { listen-on port 53 { 192.168.92.128; }; directo…

stable diffusion图生图

本节内容,给大家带来的是stable diffusion的图生图课程,我们在midjourney的课程中有学习过midjourney的图生图功能,即使用垫图的方式来引导AI绘制图片。图生图是AI绘图程序一个非常重要的功能,stable diffusion同样提供了类似的功…

论文阅读笔记:DRCT: Saving Image Super-Resolution away from Information Bottleneck

论文阅读笔记:DRCT: Saving Image Super-Resolution away from Information Bottleneck 1 背景1.1 问题1.2 本文提出的方法 2 创新点3 方法4 模块4.1 问题描述4.2 深度特征提取模块4.3 同任务渐进式训练策略 5 效果5.1 和SOTA方法对比 论文:https://arxi…