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 相同字段) 示例如下 ...
随机推荐
- flex——dictionary跟Object的区别与遍历
AS3中Object和 Dictionary都可以用来保存key-value形式的数据,Dictionary类和Object唯一的区别在于:Dictionary对象可以使用非字符串作为键值对的键.例如 ...
- Exception in thread "main" java.io.IOException: Failed to set permissions of path
在跑BuildForest的时候,编写了下面的程序: package test.breiman; import org.apache.mahout.classifier.df.mapreduce.Bu ...
- HDU 4122 Alice's mooncake shop
单调队列,裸的!!坑死了,说好的“All the orders are sorted by the time in increasing order. 呢,我就当成严格上升的序列了,于是就各种错.测试 ...
- 聚类算法初探(五)DBSCAN
最近由于工作需要,对聚类算法做了一些相关的调研.现将搜集到的资料和自己对算法的一些理解整理如下,供大家参考. 另外在算法代码方面,我也做了一些实现(包括串行和并行),欢迎感兴趣的朋友探讨和交流. 第一 ...
- POJ 3311 Hie with the Pie(状压DP + Floyd)
题目链接:http://poj.org/problem?id=3311 Description The Pizazz Pizzeria prides itself in delivering pizz ...
- GitHub以及Git学习 持续编辑学习中
官网地址: http://www.worldhello.net/gotgithub/01-explore-github/030-explore-github.html 1 加入github, http ...
- springmvc 传递和接收数组参数
java url中如何传递数组,springMVC框架controller类如何接收数组参数? 下面介绍一下URL中传递数组参数方法: dd.do?titles[]=col1&titles[] ...
- EXT属性
Extjs & Ext.Net 弹出整个浏览器对话框的方法 top.Ext.Msg.alert("值"); top.Ext.Msg.confirm("值" ...
- 解决UITableView数据没有充满屏幕时,显示多余的空白cell的问题
#pragma mark 去除多余的线 -(void) clearExtrLine{ UIView *view = [[UIView alloc] init]; view.backgroundColo ...
- iOS开发之git学习
本人是参考廖雪峰的git学习的.他写的非常详细,我在这里就是把我学习中的总结以及碰到的坑写出来. /* 初始化git仓库:git init */ /* 添加文件到git仓库 */ 分两步: 第一步:追 ...