身为数据分析师,大家对SQL可是再熟悉不过了。大多数人对常规的sql语法都已经熟练掌握,但是我发现在工作中许多同学join用的比较多,union all只有在纵向合并表格的时候用得到。如果仅仅是这样用,那么union all 的价值就被大打折扣了,今天给大家分享一下我在工作中经常用的union all技巧,希望可以帮到大家。
分组
用户分群对于数分同学来说可以说是家常便饭,这里我们来思考一个问题,如果一个用户可以同时存在多种属性,如何将用户全部分开呢?举例来说,下面有张表记录了用户收养宠物的信息,仅有两个字段,uid,pets
对用户分群,有些同学是这么做的:假如宠物仅有猫和狗两类,那么用户可以分为三类,仅养狗,仅养猫,既养狗又养猫
- –仅养狗
- select
- uid,'dog_only' as type from pets_table a where pets='狗'
- where not exists(select uid from pets_table b where pets='猫' and a.uid=b.uid)
- group by uid
- –仅养狗
- select
- uid,'cat_only' as type from pets_table a where pets='猫'
- where not exists(select uid from pets_table b where pets='狗' and a.uid=b.uid)
- group by uid
- –养狗又养猫
- select
- uid,'dog_cat' as type from pets_table a where pets='猫'
- where exists (select uid from pets_table b where pets='狗' and a.uid=b.uid)
- group by uid
如果除了养猫和养狗之外,还有仓鼠呢?
那么用户可以分为七类,分别为,仅养猫,仅养狗,仅养仓鼠,养猫和仓鼠,养猫和狗,养狗和仓鼠,三个都养。
首先通过上述例子我们总结一个规律
属性个数n与分组的数量m的关系满足:m=2^n-1。
可见分组的数量与属性个数之间存在指数关系,当属性个数大于三个后,如果使用上述sql进行分类将会非常复杂。有没有简单的方法呢?为了解释这个问题,我们用维恩图来表示上述案例