我是程序员,很多人认为,sql就是一种语言,其实不然,sql不仅仅是语言,学sql还要学会数据分析的方法论,否则没有意义。
学sql,首先应该学会正确理解数据分析的需求,公司里面,通常有商品粒度、订单粒度、用户粒度等不同粒度的数据,你应该学会根据实际的分析需求,设计这些数据表。
很多人表面上会sql,实际上根本不理解数据分析的基本概念——维度和指标,维度是group by 后面跟的分类变量,指标是聚合函数聚合起来的值。
指标通常有求和、平均、计数、去重计数等多种计算方式,所以你应该思考在sql里,sum(a*b)形式的指标有哪些,count(distinct concat(a,b))又可以产生哪些有用的指标。
那如果更复杂一点,count(distinct concat(case when , case when ))这样的聚合又能产生哪些指标,这也值得你思考。
多表连接问题可能对于很多初学者来说很绕,但是多表连接问题真的不算什么难题。
最常用的多表连接场景,是用细粒度表连接粗粒度表,比如用订单表 left join 商品表。
那更复杂的场景,比如有一张表,
有user_id和group两个字段,让你把所有user和同一个group 内的其他user关联到一起,你该怎么做
在有些场景下,使用full outer join是可行的,有时候就不行,不行的时候,你可以考虑cross join之后再用where筛除多余数据,不同的做法效率也可能千差万别。
至于窗口函数,也是sql的重头戏,很多人最多用个sum() over()就认为自己会使用窗口函数。
窗函数最常用的写法是sum( a * (case when ) ) over(partition by order by rows between x preceding and current row)
如果给你一个更复杂的场景,需要把数据多次聚合,比如订单-》用户-活动-》用户,你能应付的过来么。
当你学sql学到一定深度,你就会发现你会频繁的遇到行列转换的问题,行转列有多少种方法?select+join是一种,group by + case when又是一种,列转行有多少种方法?select + union可以。
当你掌握了我上面说的那些之后,你应该重新梳理一下with语句,也就是cte,共用表语句,这个东西很有用,相当于临时表。
有了cte,加上我上面介绍的东西,你很容易用sql做漏斗分析,包括封闭漏斗和开放漏斗,至于用户分群分析,转化路径,用户生命周期这些,你尝试一下应该都不难。
然后非平衡面板数据的处理也是个问题,比如用户粒度的数据,但是在时间维度上有缺失,你如何对缺失值进行填补,在不填补的情况下你如何避免由此造成的问题?
如果再复杂一点,同样需要把数据多次聚合,还要求你回溯前7天,前14天,前30天,前60天的数据,你又该怎么做?
按照这种方式,然后多思考,多练习,多总结,这样才能真正的学好sql。

打开网易新闻 查看精彩图片