需求
统计两列中名称数,重复的算一次
建表语句
create table wangyou2(name1 char(20),id int,name2 char(20));
数据
insert into wangyou2 values("a",1,"a"),("a",2,"a"),("a",3,"b"),("a",4,"c"),("a",5,"d"),("m",6,"a"),("f",7,"a");
实现
selectname,count(*)from(select name1 as name,id from wangyou2 where name1 = name2union allselect name1 as name,id from wangyou2 where name1 != name2union allselect name2 as name,id from wangyou2 where name1 != name2)tmpgroup by name
结果
#网友要求的结果a:7b:1c:1d:1f:1m:1#实现语句的结果+------+----------+| name | count(*) |+------+----------+| a | 7 || b | 1 || c | 1 || d | 1 || f | 1 || m | 1 |+------+----------+6 rows in set (0.00 sec)
分析
思路:1、分段处理(确保每个分段子集组合在一起可以组合成结果集,主要保证不丢数据,不重复计算)2、找出左右相等的3、找出只有左边的4、找出只有右边的5、合并在一起
扩展
1、【优化】在每个union all子项中,可以先进行聚合,这样可以减少数据量
知识点
1、union all:all是参数,语法格式为union [all|distinct]。distinct,删除结果集中重复的数据,all,返回所有结果集,包含重复数据。默认情况下union已经删除了重复数据。
文章转载自大数据最后一公里,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




