让数据库简简单单地 for you(二)

先从哪里开始呢?

先介绍下如果一个分析师或者bi团队,对于数据库而言,应该走的一个大致流程。

一、普通临时需求的流程

让数据库简简单单地 for you(二)

用一个小case来学习sql大致逻辑语法:

比如我接到一个需求:想取4月份的购买会员卡年卡的用户数量?(参考需要用到的表:如下图订单表,的所有字段--这个就叫表结构)--注意,所有id都是唯一标识

对这个需求进行拆解:

1)最终输出字段是:用户数量(一个字段)

2)条件限制:时间(4月份);用户群:购买了会员卡的用户

3)指标定义:会员卡的定义(哪些会员卡....等等)

一般接到一个需求,先要理清这三大要素

之后,开始,我要遍历数据库里的表(这里以目前的sql server库为例子)(要想找到这个表,是孰能生巧的一个过程,并且只需要掌握一些基本的比如订单主题表,用户信息表等等)。在哪里可以找到购买会员卡的用户,我可以定位到bc_renew目前的订单表,找到有user_id(用户唯一标识)作为统计用户数量的字段,zdays作为限制会员卡定义的字段,最后还需要什么呢? 看看三大要素。还需要一个时间,发现数据库里的这张表的时间字段是 the_date。(如下图的表)

让数据库简简单单地 for you(二)

好了,我们开始写sql:

让数据库简简单单地 for you(二)


好了,这个时候,我们加深一下,我现在改下需求: 想取4月份各个门店的购买会员卡年卡的用户数量?(看上图的表结构)

让数据库简简单单地 for you(二)

所有的聚合函数,都需要用到group by 分组,即是对其他数据指标进行分组后,聚合,常见的聚合函数则是count (这个是类似excel里的透视表的计数);sum (这个是类似excel里的透视表的求和),distinct 所表达的是去重

我们再加深一下,我现在改下需求: 想取4月份各个门店的购买会员卡年卡 又在该门店买月卡的用户数量?(看上图的表结构)

---这个需求主要是想知道两类用户的交集:1)4月份在门店x买了年卡用户;2)4月份在门店x买了月卡的用户

将上面两类用户求交集

让数据库简简单单地 for you(二)

这一段的知识点是在于:

两表连接取交集的join,但是结构其实没有任何变化,还是select ... from ....

首先我们看 t1 那一段取出来的是 4月份 各个城市购买年卡的用户id,t2那一段取出来的是 4月份 各个城市购买月卡的用户id,

join两张表后, 在t2 后用到了关键词 on ,on后加的是两表连接的连接条件,要讲两段t1和t2连接起来一定要条件,基本两表连接是用时间连接,只是这里两表里都在各自的where里限制了四月份所以这里不用,但是需要限制4月份在a门店买了年卡,又在a门店买了月卡的,所以t1的门店,一定要和t2的门店相同,相关联。


接下来,再深入一丢丢,我现在改下需求: 想取4月份各个门店的购买会员卡年卡 ,但在该门店没有买月卡的用户数量?(看上图的表结构) 

---这个需求主要是求,一类用户群后,针对这类用户群(购年卡用户),剔除掉一部分用户(剔除掉购买过月卡的用户)

让数据库简简单单地 for you(二)

这里主要用到的是left join ,和where 里的t2.user_id is null(null是为空)

left join 的作用是 t1作为主表,取t1的所有store_id,user_id,然后,t2里有的匹配上去。最后,t2.user_id is null则是,t2和t1所有匹配的上的user_id都为空,都不取。所以最后select取的是t1表的user_id。(ps 这个时候,如果取t2.user_id则为空)


好啦,这次基础先到这里哇。

还有进阶的未完待续呀,哈哈哈哈哈,来日方长,加油!


二、项目制数据需求的流程

让数据库简简单单地 for you(二)