SQL在业务智能中的分析函数

先说说什么是分析函数。本质上它还是在SELECT语句里使用,但和普通聚合函数最大的区别是:分析函数不会把多行合并成一行,而是能在保留原有明细数据的同时,完成各种复杂的统计计算。这个特性在做业务分析时特别有用,因为你既需要看到每笔明细,又需要看到对应的统计指标。

举个实际业务中最常见的例子------排名问题。假设你是电商公司的数据分析师,业务方想要看每个部门里销售额最高的前3名员工。用传统方法可能需要先GROUP BY部门计算每个人销售额,再用子查询或者临时表来处理排名。但用分析函数就简单多了:

这里RANK()就是典型的分许函数,PARTITION BY相当于分组,ORDER BY决定排序规则。一句SQL直接搞定,而且执行效率比那些嵌套子查询高多了。

再来看个更实用的场景------计算移动平均。做运营分析的兄弟肯定经常遇到这种需求:要看某个指标最近7天的移动平均值,用来观察趋势。比如计算每日销售额的3天移动平均:

这里的ROWS BETWEEN 2 PRECEDING AND CURRENT ROW定义了窗口范围,意思是取当前行及前面两行。这种计算用常规SQL写起来相当麻烦,但用分析函数就是这么优雅。

还有LAG和LEAD这两个函数,在做环比、同比分析时特别方便。比如要计算每个月的销售额环比增长率:

LAG能取到上一行的值,LEAD能取下一行的值,这样就不需要自关联查询了。

在实际业务中,我还经常用SUM加上窗口框架来做累计求和。比如计算每个部门员工的销售额累计占比:

这里用了两个SUM:一个带ORDER BY是做累计求和,一个不带是做部门总和。这种一次查询同时获得明细、累计值和占比的需求,在业务报表中太常见了。

说实话,我刚接触分析函数时也觉得有点绕,特别是窗口框架那块儿。但用熟练后发现,大部分业务分析需求都能归结为几种固定模式:排名、移动平均、环比、累计计算等。掌握这几种模式后,处理业务需求就轻松多了。

最后提醒几个实际使用的要点:首先要注意性能,虽然分析函数通常比等价子查询快,但数据量太大时还是可能成为瓶颈。其次,不同数据库对分析函数的支持程度有差异,写的时候要注意语法兼容性。最重要的是,写复杂分析SQL时一定要做好注释,不然过几个月自己都看不懂当时写的是什么逻辑。

建议大家在自己环境里多练习这些例子,遇到业务需求时先想想能不能用分析函数解决。用熟了之后,你会发现SQL能做的事情比想象中多得多。

相关推荐
updayday8545 分钟前
离职域账号状态变更与Ping64操作记录核对
大数据·网络·数据库·安全·智能路由器
Nturmoils29 分钟前
只恢复一张表,别把整个库都还回去
数据库
龙腾AI白云1 小时前
大语言模型:从语言理解到通用智能的跃迁
数据库·人工智能·机器学习·知识图谱
SelectDB2 小时前
快手基于 Apache Doris 千亿多模态检索的实践
大数据·数据库·数据分析
SelectDB2 小时前
StarRocks 迁移至 Apache Doris 完整指南:三步完成结构、数据与业务平滑切换
大数据·数据库·数据分析
这个DBA有点耶2 小时前
InnoDB索引组织表下,复合主键和自增主键的物理存储差异与选型对比
数据库·mysql·架构
其实防守也摸鱼2 小时前
常见安全架构中 Shiro 的认证确认机制解析
运维·服务器·数据库·windows·github
TDengine (老段)3 小时前
TDengine 常见问题 TOP7
大数据·数据库·时序数据库·常见问题·tdengine·涛思数据
+VX:Fegn08953 小时前
计算机毕业设计|基于java+ vue共享单车信息系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
mysqloffice3 小时前
数智时代,核心系统数据库架构往哪走
数据库·人工智能