Oracle初级入门 根据某字段重复只取一条记录,并计计算重复条数
在平常开发中,去重复数据经常使用到,本人新手,接触Oracle也不久,开发中用到的小知识点,记录一下,老鸟可绕道,如果有写错的,请指正。
去重复记录可以使用distinct,当只查询一列数据时,可以轻松去掉重复的数据,当查询多列数据时,如果有一列的数据不相同,distinct则认为数据是不相同的,也就是数据将不会合并,这时类似是group by 某写字段的结果一样,此时的结果可能不是我们想要的。下面说下查询多列时去重复及合计重复记录的条数。
当做个不同的链接查询,得到的结果如下:
select
rownum,
z.zdbh,
z.adsljdsbmc,
z.glwxtgdbh,
sysdate
from rebase_ztgd z left join rebase_dzgd d
on z.glwxtgdbh=d.djbh
而如果这样写
select
rownum,
z.zdbh,
z.adsljdsbmc,
z.glwxtgdbh,
sysdate
from rebase_ztgd z left join rebase_dzgd d
on z.glwxtgdbh=d.djbh
where z.glwxtgdbh is not null and z.id in(select min(id) from rebase_ztgd b group by b.glwxtgdbh ) order by z.id desc;
重复数据只取一条,关键代码是这里:
z.id in(select min(id) from rebase_ztgd b group by b.glwxtgdbh )这句就是从重复的
glwxtgdbh字段分组,然后取出最小ID的那条记录,当然,里边不一定是使用min,也可以用Max 下面说下怎么记录重复记录的条数:
首先看下这行SQL语句的效果:
select id,z.glwxtgdbh,row_number() over (order by id) x from rebase_ztgd z;
其实就是用到row_number()函数,根据ID排序,生成一列连续编号的列X
再看下面这行SQL语句:
select id,z.glwxtgdbh,row_number() over (partition by z.glwxtgdbh order by id) x from rebase_ztgd z;
这句大概意思是,用row_NUMBER()函数配合over聚合函数,对单列glwxtgdbh
分组 分组内按id排序:
然后看下上面两个相减的结果:
select z.id,z.glwxtgdbh,z.zdbh,z.adsljdsbmc,row_number() over (order by z.id) - row_number() over (partition by z.glwxtgdbh order by z.id) x from rebase_ztgd z
大致意思是id排序值 减去glwxtgdbh
分组内id排序值 = 连续相同值的排序值
然后使用count函数就可以计算出每组的条数了
select
max(zdbh),
count(*),
max(adsljdsbmc)节电设备名称,
max(glwxtgdbh)关联工单,
sysdate
from(
select z.id,z.glwxtgdbh,z.zdbh,z.adsljdsbmc,row_number() over (order by z.id) - row_number() over (partition by z.glwxtgdbh order by z.id) x from rebase_ztgd z left join rebase_dzgd d
on z.glwxtgdbh=d.djbh)
where glwxtgdbh is not null
group by x
order by min(id)
我想合并成这样的
然后将两个列合并下就可以了:如下
select to_char(rownum) 序号,t.* from(
select
case when count(*)=1 then max(zdbh)||'有'||count(*)||'张' else max(zdbh)||'等'||count(*)||'张' end 主单编号,
max(adsljdsbmc)节电设备名称,
max(glwxtgdbh)关联工单,
sysdate
from(
select z.id,z.glwxtgdbh,z.zdbh,z.adsljdsbmc,row_number() over (order by z.id) - row_number() over (partition by z.glwxtgdbh order by z.id) x from rebase_ztgd z left join rebase_dzgd d
on z.glwxtgdbh=d.djbh)
where glwxtgdbh is not null
group by x
order by min(id)
)t
union all
select
'合计'序号,'','','',sysdate from dual
效果如下:
这样就完成了。。
获取重复数据可用:
select * from rebase_ztgd where glwxtgdbh in ( select glwxtgdbh from rebase_ztgd group by glwxtgdbh having count(id) > 1 )
Oracle初级入门 根据某字段重复只取一条记录,并计计算重复条数的更多相关文章
- SQL查找TCar表中同一辆车前后两条记录的CarId,两条记录中有多个字段值一样
查询同一个表中某一字段值相同的记录 select * from 表名 where 字段 in(select 字段 from 表名 group by 字段 having count(1)>1) s ...
- sql根据某一个字段重复只取第一条数据
比如上图,取3,4行记录的第一行也就是3行,而不返回4行. 使用分析函数row_number() over (partiion by ... order by ...)来进行分组编号,然后取分组标号值 ...
- sql小技巧 group by datetime类型字段,只取其中的日期部分
工作中经常会遇到,要在sql中查询报表,查询结果要求按照日期来罗列, 或按照天, 或按照月,年. 这个时候我们经常会苦恼,datetime是精确到毫秒的,如果单纯的group by datetime就 ...
- 取得数据表中前N条记录,某列重复的话只取第一条记录
项目需要筛选出不重复数据,以前没有做过,第一反应就是利用distinct处理,但是弄了好久也没搞出来,大家有知道的望告知下. 这次筛选没有使用distinct ,是利用group by ,利用id为唯 ...
- oracle中找出某个字段中有非数字型的记录
工作中遇到一个大表记录中有非法非数字字符,不想用正则语法去做, 用一条SQL语句查出来的方法如下: select * from table where translate(col,'*01234567 ...
- php实现只保留mysql中最新1000条记录
这篇文章主要介绍了php实现只保留mysql中最新1000条记录的方法和相关示例及数据库结构,十分的全面,有需要的小伙伴可以参考下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- SQL排除重复结果只取字段最大值
如何用SQL排除重复结果只取字段最大值的记录?要求得到的结果(即是PID相同的记录只取ID值最大的那一条). select * from [Sheet1$] a from [Sheet1$] wher ...
- 笔记:Oracle查询重复数据并删除,只保留一条记录
1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group byId having cou ...
- Mysql,重复字段只取其中一行
Mysql,重复字段只取其中一行 格式 : select 字段 from [表] where 其他字段 in (select 函数(其他字段) from [表] group by 相同字段) 示例如下 ...
随机推荐
- OC基础2:一些基本概念
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.字符常量是存放在单引号中的单个字符,字 ...
- HttpContext详解【转】
HttpContext 类:封装有关个别 HTTP 请求的所有 HTTP 特定的信息. 在处理请求执行链的各个阶段中,会有一个对象在各个对象之间进行传递,也即会保存请求的上下文信息,这个对象就是Htt ...
- JS正则表达式大全【转】
正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个 ...
- Apple Mach-O Linker Warning 警告解决的方法
此警告解决的方法: 项目名字 -> targets -> Build Settings -> search path 把里面无用的东西 点 减号 删掉 即可了. $(function ...
- js简易写法
我写JavaScript代码已经很久了,都记不起是什么年代开始的了.对于JavaScript这种语言近几年所取得的成就,我感到非常的兴奋:我很幸运也是这些成就的获益者.我写了不少的文章,章节,还有一本 ...
- IE下图片切换的时候,图片总是切换不成功---根本问题是IE缓存图片
作为WEB设计者,为了在网页展示上加强用户体验,经常会利用图象载入显示状态方法,这自然需要Image对象的onload事件. 在firefox浏览器下完成开发后,可是在IE浏览器中进行调试总不能被调用 ...
- 【27前端】背景半透明rgba LESS实践
今天有看到司徒正美<背景半透明rgba最佳实践>的文章和里面推荐的一个在线工具CSS背景颜色属性值转换 . 于是联系到自己的less库,新技能Get. 内容如下: /*在你的less库中 ...
- input的样式简介
<input type="text" autocomplete="off" placeholder="" x-webkit-speec ...
- VirtualBox镜像复制载入
转发:http://blog.csdn.net/dotuian/article/details/9127229 一,虚拟镜像文件格式 VirtualBox磁盘镜像文件(VDI, VMDK, VHD, ...
- (三)Android中Intent概念及应用
一.显示Intent startActivity(new Intent(MainActivity.this,BAty.class)); 显示Intent直接指定要启动的Intent类 注意自己通过创建 ...