首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Oracle去重查询实例

Oracle去重查询实例

作者头像
全栈程序员站长
发布2022-11-17 15:26:19
发布2022-11-17 15:26:19
1.3K0
举报

大家好,又见面了,我是你们的朋友全栈君。

Oracle去重查询实例

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

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

这样查出来一共有295136个空号

之后我想查出每天识别出的不重复的空号有多少,开始没想太多,直接写了

代码语言:javascript
复制
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)来保留重复的其中一项,代码如下:
代码语言:javascript
复制
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!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/234153.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年11月3日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Oracle去重查询实例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档