mysql 之 去重(三行重复数据,取列权重最高行的一行留下)

mysql 之 去重 三行重复数据,取列权重最高行的一行留下

1.需求

将图一 数据 加工成 图二的数据
图一:
图一
图二:
图二
IS_SD_CALL/IS_ZB_WOSALE/IS_CBSS 字段下的数字 表示权重,数字越大权重越高,权重最高的那一行留下 ,其他行消除。

2. 解决

整体解决方案:

select 
	 x.no ,x.number ,
	 case  when x.IS_SD_CALL <> '' and  x.IS_SD_CALL = '10'  then '是' else  ''  end as IS_SD_CALL,
	 case  when  x.IS_ZB_WOSALE <> ''  and    x.IS_ZB_WOSALE = 5 and    x.IS_SD_CALL = ''    then '是' else '' end as IS_ZB_WOSALE,
	 case  when   x.IS_CBSS <> ''  and    x.IS_CBSS  = 1 and   x.IS_SD_CALL = ''  and  x.IS_ZB_WOSALE = ''  then '是' else '' end as IS_CBSS
from (
	select  	
		no ,number 
		max(IS_SD_CALL ) IS_SD_CALL ,
		max(IS_ZB_WOSALE ) IS_ZB_WOSALE ,
		max(IS_CBSS ) 	IS_CBSS 
	from cbss_call_wosale_detail_tmp t 
	group  by 	no ,number
 ) x ;

解释:
1.

select  	
		no ,number 
		max(IS_SD_CALL ) IS_SD_CALL ,
		max(IS_ZB_WOSALE ) IS_ZB_WOSALE ,
		max(IS_CBSS ) 	IS_CBSS 
	from cbss_call_wosale_detail_tmp t 
	group  by 	no ,number

此sql 是根据 no,number 进行分组查询,并且取每一列最大值,也就是分组查询完成后,会把权重数字都留到了一行,就如同下面这样:
11
2.因为要把权重最高的那列设为 是 ,其他的置为空,则使用case when 来进行判断(三列中只能有一个是,其他的均为 空 )

select 
	 x.no ,x.number ,
	 case  when x.IS_SD_CALL <> '' and  x.IS_SD_CALL = '10'  then '是' else  ''  end as IS_SD_CALL,
	 case  when  x.IS_ZB_WOSALE <> ''  and    x.IS_ZB_WOSALE = 5 and    x.IS_SD_CALL = ''    then '是' else '' end as IS_ZB_WOSALE,
	 case  when   x.IS_CBSS <> ''  and    x.IS_CBSS  = 1 and   x.IS_SD_CALL = ''  and  x.IS_ZB_WOSALE = ''  then '是' else '' end as IS_CBSS
from (
	select  	
		no ,number 
		max(IS_SD_CALL ) IS_SD_CALL ,
		max(IS_ZB_WOSALE ) IS_ZB_WOSALE ,
		max(IS_CBSS ) 	IS_CBSS 
	from cbss_call_wosale_detail_tmp t 
	group  by 	no ,number
 ) x ;

完。

若有错误,希望大佬指出。
对你有帮助给点个👍再走呗。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值