SQL进阶的技巧:如何实现某列的累计乘积?

0 场景描述

在做数据处理的时候,尤其是复利累积的时候,有时候会有这样一场景,通过某种条件找到一列数据X1,X2,X3...Xn,然后想要求y=X1X2X3...Xn。下面给出一个具体案例来详细解释这一问题,如下图所示,每个组的name值只有2个(2个A/B/C),当name=A or C时,price为value字段的乘积,当name=B时候,price为vlaue字段的和。

1 数据准备

sql 复制代码
create table multi_value as 
(

  select stack(
      12,
	  'A',2,'甲',
	  'B',5,'甲',
	  'C',1,'甲',
	  'B',7,'甲',
	  'B',7,'甲',
	  'A',1,'甲',
	  'C',4,'甲',
	  'A',5,'乙',
	  'B',4,'乙',
	  'C',6,'乙',
	  'B',4,'乙',
	  'A',3,'乙',
	  'C',5,'乙'
  
  )as(name,value,org)

);

2 问题分析

本问题的难点在于求value列的累乘积,这个粗看时没有办法通过SQL实现的,因为SQL里面的分组汇总函数就那么几个sum,avg,max,min,count没有办法直接求一组数据连续相乘。经过仔细研究,我们可以利用数学中的对数恒等式及对数加法原理进行求解,公式如下:

对数加法原理:

log(MN)= log M + log N

ln M*N = ln M + ln N

对数恒等式:

a^(LogaN)=N

e^(ln N) =N

根据上述公式那么

A*B = EXP(ln(A*B)) = EXP(lnA+lnB) = EXP(SUM(ln(FiledName)))

A*B = POWER(10, SUM(LOG(10,FiledName)))

即 A*B累计乘积就可以转换为对数运算+sum求和形式计算

完整的SQL如下:

sql 复制代码
select name
     , case
           when name in ('A', 'C') then exp(sum(ln(value)))
           when name in ('B') then sum(value) end price
     , org
from multi_value
group by org, name

3 小结

本题主要利用数学中对数加法原理及对数恒等式进行求解,具有很强的技巧性,在实际分析中如复利累积场景中会遇到。

觉得以上内容还不错的,想学更多SQL技巧的可以关注以下专栏

数字化建设通关指南

专栏原价99,现在活动价39.9,按照阶梯式增长,直到恢复原价

主要内容:

(1)SQL进阶实战技巧

可以参考如下教程,具体链接如下

SQL很简单,可你却写不好?也许这才是SQL最好的教程

上面链接中的文章及技巧会不定期更新。

(2)数仓建模实战技巧和个人心得

1)新人入职新公司后应如何快速了解业务?

2)以业务视角看宽表化建设?

  1. 维度建模 or 关系型建模?

4)业务模型与数据模型有什么区别?业务阶段的模型该如何建设?

5)业务指标体系该如何建设?指标体系该如何维护?指标平台应如何建设?指标体系 该由谁来搭建?

6)如何优雅设计DWS层?DWS层模型好坏该如何评价?

7)指标发生异常,该如何排查?应从哪些方面入手寻找问题点?

8) 数据架构的选择,mpp or hadoop?

9)数仓团队应如何体现自己的业务价值,讲好数据故事?

10)BI与大数据有什么关系?BI与信息化、数字化之间有什么关系?BI与报表之间的关 系?

11)数据部门如何与业务部门沟通,并规划指引业务需求?

文章不限于以上内容,有新的想法也会及时更新到该专栏。

具体专栏链接如下:

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

相关推荐
CRMEB系统商城6 分钟前
Redis + 消息队列 + 连接池:CRMEB PRO 性能优化的三驾马车
大数据·数据库·人工智能·小程序·php·1024程序员节
鸽芷咕18 分钟前
KingbaseES SQL 调优六步法:定位、诊断、下药、验证,一步都别省
数据库
小poop32 分钟前
HTML 基础入门:从结构到常用标签详解
前端
jiangliushi632 分钟前
GPT-6.1 Sol 免费用:PowerShell 装 Codex 报“禁止运行脚本 npm.ps1”?一条命令解决
前端·gpt·npm
计算机魔术师44 分钟前
日均500万亿词元,国内推理速度翻倍却仍落后国外——差距卡在哪
前端
excel1 小时前
用 Node.js 搭建一套可持续获客的 SEO 内容系统:前端工程师 30 天实战方案
前端·后端
黄俊懿1 小时前
【架构师从入门到进阶】第七章:缓存和存储的优化思路——第一节:缓存概述
数据结构·数据库·分布式·缓存·架构·系统架构·1024程序员节
John_Hui1 小时前
MySQL 进阶知识
数据库·sql·mysql·1024程序员节
yma161 小时前
从零搭建 P2P 聊天室:yma16.cloud 在线工具实战
前端·1024程序员节
java_nnnn1 小时前
Redis 核心特性与应用场景:从底层原理到分布式系统应用
数据库·redis·1024程序员节