在平常开发中,去重复数据经常使用到,本人新手,接触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初级入门 根据某字段重复只取一条记录,并计计算重复条数的更多相关文章

  1. SQL查找TCar表中同一辆车前后两条记录的CarId,两条记录中有多个字段值一样

    查询同一个表中某一字段值相同的记录 select * from 表名 where 字段 in(select 字段 from 表名 group by 字段 having count(1)>1) s ...

  2. sql根据某一个字段重复只取第一条数据

    比如上图,取3,4行记录的第一行也就是3行,而不返回4行. 使用分析函数row_number() over (partiion by ... order by ...)来进行分组编号,然后取分组标号值 ...

  3. sql小技巧 group by datetime类型字段,只取其中的日期部分

    工作中经常会遇到,要在sql中查询报表,查询结果要求按照日期来罗列, 或按照天, 或按照月,年. 这个时候我们经常会苦恼,datetime是精确到毫秒的,如果单纯的group by datetime就 ...

  4. 取得数据表中前N条记录,某列重复的话只取第一条记录

    项目需要筛选出不重复数据,以前没有做过,第一反应就是利用distinct处理,但是弄了好久也没搞出来,大家有知道的望告知下. 这次筛选没有使用distinct ,是利用group by ,利用id为唯 ...

  5. oracle中找出某个字段中有非数字型的记录

    工作中遇到一个大表记录中有非法非数字字符,不想用正则语法去做, 用一条SQL语句查出来的方法如下: select * from table where translate(col,'*01234567 ...

  6. php实现只保留mysql中最新1000条记录

    这篇文章主要介绍了php实现只保留mysql中最新1000条记录的方法和相关示例及数据库结构,十分的全面,有需要的小伙伴可以参考下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  7. SQL排除重复结果只取字段最大值

    如何用SQL排除重复结果只取字段最大值的记录?要求得到的结果(即是PID相同的记录只取ID值最大的那一条). select * from [Sheet1$] a from [Sheet1$] wher ...

  8. 笔记:Oracle查询重复数据并删除,只保留一条记录

    1.查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group byId having cou ...

  9. Mysql,重复字段只取其中一行

    Mysql,重复字段只取其中一行 格式 : select 字段 from [表] where 其他字段 in (select 函数(其他字段) from [表] group by 相同字段) 示例如下 ...

随机推荐

  1. 杭电oj 2037 今年暑假不AC

    Tips:贪心算法的典型应用,可以按照节目结束时间由小到大排序,(至于结束时间相同的,有些人说按开始时间早的排序,不过个人认为不必处理,因为结束时间一样,两个之中要么都没有,要么必有一个)然后再依次进 ...

  2. 【LeetCode练习题】Reverse Linked List II

    Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass. F ...

  3. Android面试题目及其答案

    转自:http://blog.csdn.net/wwj_748/article/details/8868640 Android面试题目及其答案 1.Android dvm的进程和Linux的进程, 应 ...

  4. 去掉UItableview headerview黏性

    //去掉UItableview headerview黏性 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView ...

  5. oracle11g用户名密码不区分大小写

    oracle 11g 以前的版本的用户名和密码是不区分大小写的; oracle 11g 用户名和密码默认区分大小写,可更改alter system set sec_case_sensitive_log ...

  6. Boost.Python:使用继承

    An example #include <boost/python.hpp> #include <memory> #include <iostream> using ...

  7. PHP 源码加密扩展(php-beast)PHP7 版本发布

    此版本主要支持PHP7,在github(https://github.com/liexusong/php-beast)上选择php7分支然后编译安装即可.   来源于:https://github.c ...

  8. easyui的datagrid删除一条记录后更新出问题

    1.问题 如果先删除一条记录,然后不选中一条记录,去更新一条,默认是有选中的记录的,就是被删除的那条记录. 2.解决方法 $("#dg").datagrid('uncheckAll ...

  9. linux 如何禁用账号和解除禁用账号

    把账号禁用可以有几个方法:1. # usermod -L <username> # usermod -U <username> // 解除禁用2. 修改/etc/passwd文 ...

  10. LayoutInflater 与 inflate

    Instantiates a layout XML file into itscorresponding View objects. LayoutInflater作用是将layout的xml布局文件实 ...