group by 去重处理数据

1.




# 需求:结果:
# + ----+------+
# | name|boy_id|
# + ----+------+
# | A   |1     |
# | B   |2     |
# | C   |3     |
# + ----+------+

#  group by 对结果的重复数据去重
select  * from girl ;

# +--+----+------+
# |id|name|boy_id|
# +--+----+------+
# |1 |A   |1     |
# |2 |B   |2     |
# |3 |C   |3     |
# |4 |C   |3     |
# |5 |C   |3     |
# +--+----+------+



select  name ,boy_id  from girl group by name ,boy_id ;

# +----+------+
# |name|boy_id|
# +----+------+
# |A   |1     |
# |B   |2     |
# |C   |3     |
# +----+------+

#

select id ,name ,boy_id from girl ;

# +--+----+------+
# |id|name|boy_id|
# +--+----+------+
# |1 |A   |1     |
# |2 |B   |1     |
# |3 |C   |3     |
# |4 |C   |3     |
# |5 |C   |3     |
# |6 |D   |NULL  |
# |7 |D   |NULL  |
# |8 |C   |2     |
# +--+----+------+

# 如果根据 唯一的一个字段 分组的话,数据量是不变的(比如id,分组原理:id 一样的前提下,才会两条数据合并成一条)

select id ,name ,boy_id from girl  group by id ,name ,boy_id ;
# +--+----+------+
# |id|name|boy_id|
# +--+----+------+
# |1 |A   |1     |
# |2 |B   |1     |
# |3 |C   |3     |
# |4 |C   |3     |
# |5 |C   |3     |
# |6 |D   |NULL  |
# |7 |D   |NULL  |
# |8 |C   |2     |
# +--+----+------+

#  name 和 boy_id  一样的数据
  select  name ,boy_id from girl  group by name ,boy_id ;

# +----+------+
# |name|boy_id|
# +----+------+
# |A   |1     |
# |B   |1     |
# |C   |3     |
# |D   |NULL  |
# |C   |2     |
# +----+------+



# 各个 相同  name 和 boy_id  的数据有几条
select name, boy_id, count(1) as cnt
from girl
group by name, boy_id;

# +----+------+---+
# |name|boy_id|cnt|
# +----+------+---+
# |A   |1     |1  |
# |B   |1     |1  |
# |C   |3     |3  |
# |D   |NULL  |2  |
# |C   |2     |1  |
# +----+------+---+


# 进阶版本:

select  * from boy  ;

# +--+----+--------+
# |id|name|del_flag|
# +--+----+--------+
# |1 |慕容皝 |0       |
# |2 |慕容垂 |0       |
# |3 |慕容博 |1       |
# |4 |慕容复 |1       |
# +--+----+--------+

select  * from girl ;

# +--+----+------+
# |id|name|boy_id|
# +--+----+------+
# |1 |A   |1     |
# |2 |B   |2     |
# |3 |C   |3     |
# |4 |C   |3     |
# |5 |C   |3     |
# |6 |D   |NULL  |
# +--+----+------+

# 需求:  统计每个女生是否真正有男友的情况(假设女生姓名唯一;boy_id 为 3 的男生 已经 被 删掉了,认为 c 没有男友 ),并且去重,结果数据如下:

# +  ----+------+
# |  name|boy_id| flag
# +  ----+------+
# |  A   |1     |  0
# |  B   |2     |  0
# |  C   |3     |  0
# |  D   |NULL  |  0
# +  ----+------+


select name,
       boy_id ,
       case
           when (select count(1) from boy where boy.id  = girl.boy_id and boy.del_flag = 0 ) > 0
               then  1
           else
               0
        end as flag
from girl;
# 结果如下:
# +----+------+----+
# |name|boy_id|flag|
# +----+------+----+
# |A   |1     |1   |
# |B   |2     |1   |
# |C   |3     |0   |
# |C   |3     |0   |
# |C   |3     |0   |
# |D   |NULL  |0   |
# +----+------+----+

#  用户c 的boy_id 都是 3 ,所以分组思路有两个 ① 对元数据进行分组  ② 对 结果数据进行分组

# ① 对元数据进行分组

select name,
       boy_id ,
       case
           when (select count(1) from boy where boy.id  = Tem.boy_id and boy.del_flag = 0 ) > 0
               then  1
           else
               0
        end as flag
from (select  name,boy_id from girl group by name,boy_id ) Tem group by   name ,boy_id ,flag ;

# +----+------+----+
# |name|boy_id|flag|
# +----+------+----+
# |A   |1     |1   |
# |B   |2     |1   |
# |C   |3     |0   |
# |D   |NULL  |0   |
# +----+------+----+




# ② 对 结果数据进行分组

select name,
       boy_id ,
       case
           when (select count(1) from boy where boy.id  = girl.boy_id and boy.del_flag = 0 ) > 0
               then  1
           else
               0
        end as flag
from girl group by   name ,boy_id ,flag ;

# +----+------+----+
# |name|boy_id|flag|
# +----+------+----+
# |A   |1     |1   |
# |B   |2     |1   |
# |C   |3     |0   |
# |D   |NULL  |0   |
# +----+------+----+


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值