大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全家桶1年46,售后保障稳定
Oracle去重查询实例
今天工作中遇到了一个关于去重的查询,琢磨了半天,终于想明白了,这里简单记录一下。
- distinct函数
说到去重,可能第一反应就是distinct函数,但其实distinct只是针对单一字段的去重有效。
例如我想查库中所有的不重复的空号手机数量,如下即可
select count(distinct n.phonenumber)
from IVR_NO_EXIST n
这样查出来一共有295136个空号
之后我想查出每天识别出的不重复的空号有多少,开始没想太多,直接写了
select
n.dial_date,
count(distinct n.phonenumber) as CNT_Invalid
from IVR_NO_EXIST n
group by n.dial_date
order by n.dial_date
结果还是可以正常显示的,但是每一天的空号数量之和要大于总的非重复空号数,我开始怀疑哪里出错了。
- 多个条件时的去重
其实这里出现问题的不在于同一天里有重复的空号,每一天的空号其实还是unique的,只是可能后面出现的空号是前些天已经识别出来的,这部分其实不应该被计入到非重复的空号中,因为前面已经记过一次了
dial_date | phone_number |
---|---|
20200731 | 12345678910 |
20200806 | 12345678910 |
可以看出其实同一个号码在不同天的记录都被计入了,这是不行的,我们必须要对这部分进行去重。
- Solution:
可以考虑用max(rowid)来保留重复的其中一项,代码如下:
select
n.dial_date,
count(distinct n.phonenumber) as CNT_Invalid
from IVR_NO_EXIST n
where
n.rowid=(select max(e.rowid)
from IVR_NO_EXIST e
where e.phonenumber=n.phonenumber)
group by n.dial_date
order by n.dial_date
结果:
按照这段代码运行后每天的空号数量之和就与直接用count(distinct phonenumber)查出来的一样了。
凡事多思考,勤动手,there must be a way out!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234153.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...