之前的sql3天入门系列,讲过select统计用户维度的报表,每次看结果时都需要写一遍sql或执行一遍sql,要命的是总是变化调整参数,很是头疼,没技术含量。
细品,这就是重复的操作,根据条件反射,咱们必须封装,用存储过程来搞定重复的查询统计,并且还可以把结果存起来,随时查看。(当然,为了查看还有更方便的方式,对接到数据平台外化为图表,关注后续文章会有分享。)
今天内容直接就是实战,没有理论了。Mysql相关基础请移步至Mysql专栏系列文章(点击查看)。
1、rpt报表ETL,v1.1 版本
接昨天案例实现了用户维度的行为日报表,还有周、月等周期报表也要实现。
一种方式是,复制日报的调整一下变为周报、月报,当然可以,但代码看着重复且冗长。
所以换一种方式,把重复地复用起来,通常变量实现不同周期类型。
定义变量I_rt为报表周期类型,就可以获得相应统计日期范围的开始日期@s和结束日期@e字段,代入统计sql中控制mid_eve的where范围,从而就实现了相应周期的统计。如下:
2、继续升级,v1.2 版本,有2处升级
(1)上面1.1版本有bug,就是重跑数据时,会造成数据重复,因为只有insert操作。所以,应该是先删除已存在数据再插入,即先删后入。
(2)还可再思考下,获取周期的开始日期@s和结束日期@e的select into语句,在其他的rpt的ETL中应该也会使用到,所以也是重复的,那就封装为存储过程来调用(out返回这2个值)。
3、插曲
本想把drop function或procedure封装为自定义函数或存储过程,出现以下报错,确实不能了。
Can't drop or alter a FUNCTION from within another stored routine
以前用R做ETL,已把DB管理相关的sql语句全部封装为函数,甚是方便。现在Sql不支持这样封装,那就拼手速吧。
4、总结
(1)存储过程确实挺方便,用sql的语言去程序式处理sql数据,天然地容易。
(2)也有不足,参数不是动态的,调用时必须全部输入参数。存储教程的机制没有深入了解,变量使用、上面那个插曲,都没能解决。后续再研究。
(3)rpt报表的ETL的一个存储过程方式的模板已经写好,可以直接复用。
(4)即将出现一个重要的问题就是调度了,多个存储过程起来后怎么办,手工调用是不现实的,必须自动调用。以前用azkaban、crontab等调度工具,是ok的,但我们先小而美,尝试用Mysql的触发器来实现自动调用存储过程。
如对您有帮助,请关注专栏文章和后续文章。