点击上方【蓝色】字体 关注我们

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

复合增长率的计算公式如下:
复合增长率 = (最终值 初始值)^( 1 n) - 1
其中:
举例来说,假设某项指标在起始时刻(一月份)为 100,经过 6 个月(到达七月份)的增长,最终值为 200,则可以按照以下步骤计算月均复合增长率:
月均复合增长率 = ( (200 100)^(1 (7-1)) -1) * 100%
这样就得到了某指标经过 6 个月的整体增长率(复合增长率) 为12.25%。
在计算月均或年均复合增长率时,需要使用连续的起始值和结束值来进行计算。假设有 n 个连续的月份数据,那么起始值到结束值的时间跨度为 n-1 个月,只计算后续的增长情况。
以年度为单位计算的复合增长率被称为年均复合增长率,以月度为单位计算的复合增长率被称为月均复合增长率。查询自2018年1月以来不同产品的月均销售额复合增长率?
02 数据准备
-- 创建销量表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);

03 问题分析
步骤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_ratefrom (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%
04 小 结
往期精彩
数据科学与SQL:如何计算Teager能量算子(TEO)?| 基于SQL实现
SQL进阶技巧:如何取时间序列最新完成状态的前一个状态并将完成状态的过程进行合并?
SQL进阶技巧:如何对不同表结构合并计算 | FULL JOIN问题
会飞的一十六
扫描右侧二维码关注我们
点个【在看】 你最好看

文章转载自会飞的一十六,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。






