UNION ALL这么用,从摸鱼学徒进阶武林高手

身为数据分析师,大家对SQL可是再熟悉不过了。大多数人对常规的sql语法都已经熟练掌握,但是我发现在工作中许多同学join用的比较多,union all只有在纵向合并表格的时候用得到。如果仅仅是这样用,那么union all 的价值就被大打折扣了,今天给大家分享一下我在工作中经常用的union all技巧,希望可以帮到大家。

分组

用户分群对于数分同学来说可以说是家常便饭,这里我们来思考一个问题,如果一个用户可以同时存在多种属性,如何将用户全部分开呢?举例来说,下面有张表记录了用户收养宠物的信息,仅有两个字段,uid,pets

对用户分群,有些同学是这么做的:假如宠物仅有猫和狗两类,那么用户可以分为三类,仅养狗,仅养猫,既养狗又养猫


  1. –仅养狗 
  2. select  
  3. uid,'dog_only' as type from pets_table a where pets='狗' 
  4. where not exists(select uid from pets_table b where pets='猫' and a.uid=b.uid)  
  5. group by uid 
  6.  
  7. –仅养狗 
  8. select  
  9. uid,'cat_only' as type from pets_table a where pets='猫' 
  10. where not exists(select uid from pets_table b where pets='狗' and a.uid=b.uid) 
  11. group by uid 
  12.  
  13. –养狗又养猫 
  14. select  
  15. uid,'dog_cat' as type from pets_table a where pets='猫' 
  16. where exists (select uid from pets_table b where pets='狗' and a.uid=b.uid) 
  17. group by uid 

如果除了养猫和养狗之外,还有仓鼠呢?

那么用户可以分为七类,分别为,仅养猫,仅养狗,仅养仓鼠,养猫和仓鼠,养猫和狗,养狗和仓鼠,三个都养。

首先通过上述例子我们总结一个规律

属性个数n与分组的数量m的关系满足:m=2^n-1。

可见分组的数量与属性个数之间存在指数关系,当属性个数大于三个后,如果使用上述sql进行分类将会非常复杂。有没有简单的方法呢?为了解释这个问题,我们用维恩图来表示上述案例

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章