Oracle去重查询实例

Oracle去重查询实例Oracle去重查询实例今天工作中遇到了一个关于去重的查询,琢磨了半天,终于想明白了,这里简单记录一下。distinct函数说到去重,可能第一反应就是distinct函数,但其实distinct只是针对单一字段的去重有效。例如我想查库中所有的不重复的空号手机数量,如下即可selectcount(distinctn.phonenumber)fromIVR_NO_EXISTn这样查出来一共有295136个空号之后我想查出每天识别出的不重复的空号有多少,开始没想太多,直接写了sel

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

Oracle去重查询实例

今天工作中遇到了一个关于去重的查询,琢磨了半天,终于想明白了,这里简单记录一下。

  1. distinct函数
    说到去重,可能第一反应就是distinct函数,但其实distinct只是针对单一字段的去重有效。
    例如我想查库中所有的不重复的空号手机数量,如下即可
select count(distinct n.phonenumber)
from IVR_NO_EXIST n

Jetbrains全家桶1年46,售后保障稳定

这样查出来一共有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

结果还是可以正常显示的,但是每一天的空号数量之和要大于总的非重复空号数,我开始怀疑哪里出错了。

  1. 多个条件时的去重
    其实这里出现问题的不在于同一天里有重复的空号,每一天的空号其实还是unique的,只是可能后面出现的空号是前些天已经识别出来的,这部分其实不应该被计入到非重复的空号中,因为前面已经记过一次了
dial_date phone_number
20200731 12345678910
20200806 12345678910

可以看出其实同一个号码在不同天的记录都被计入了,这是不行的,我们必须要对这部分进行去重。

  1. 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账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号