精华内容
下载资源
问答
  • 对数据库某些意外情况,引起的重复数据,如何处理呢? ----------------查重复: select * from satisfaction_survey s where s.as_side = 0 and s.project_no in (select ss.project_no from ...

    对数据库某些意外情况,引起的重复数据,如何处理呢?

    ----------------查重复:

    select *
      from satisfaction_survey s
     where s.as_side = 0
       and s.project_no in (select ss.project_no
                              from satisfaction_survey ss
                             where ss.as_side = 0
                             group by ss.project_no
                            having count(*) > 1)
     order by s.project_no, s.submit_time

    思路:从预先选出的数据中(s.as_side = 0),根据特定字段(s.project_no),判断是否存在(count(*) > 1,符合条件的数据不止一条)重复数据

    当然,也可以根据多个字段(in 前面的字段,用个括号括起来,in select子句的返回字段对应改变)判断是否存在重复数据

    ----------------------去重复:

    delete from satisfaction_survey s
     where s.as_side = 0
     and(s.project_no/*, to_char(s.submit_time, 'yyyy-mm-dd')*/) in
           (select ss.project_no/*, to_char(ss.submit_time, 'yyyy-mm-dd') */
           from satisfaction_survey ss
           where ss.as_side=0//根据自己实际情况,确定子句(清楚每个sql的结果集很重要)
           group by ss.project_no/*, to_char(ss.submit_time, 'yyyy-mm-dd')*/
          having count(*) > 1)
       and rowid not in
           (select max(rowid) from satisfaction_survey where as_side=0 group by project_no/*, to_char(submit_time, 'yyyy-mm-dd')*/ having count(*) > 1)

    思路:在删除全部重复数据时,保留一条(and rowid not in)符合自己需求的数据

    这里为了保证程序的健壮性,可以在查询数据时防止查出多条数据,在返回结果外面加一层,只取一条数据:

    select *
      from (SELECT ROW_NUMBER() OVER(ORDER BY s.submit_time) 插入时间, s.*
              FROM satisfaction_survey s
             where s.project_no = 'WW-PM-2017-RP-449'
               and s.employee_no = 'BF1019589'
               and s.as_side = 0
               --and s.mark is not null)
               and s.mark is null)
     where 插入时间 = 1

    这里根据时间排序,取符合条件的第一条

    转载于:https://www.cnblogs.com/zz-3m23d-begining/p/8206149.html

    展开全文
  • 例子:根据表的TIME来过滤重复的PID,取TIME排序后的最新的值 select m.pid from(select pid ,row_number() OVER(PARTITION BY pid ORDER BY time desc) as pid_row from 表 )m where m.pid_row='1' 这

    用Oracle的row_number() over函数来解决该问题

    例子:根据表的TIME来过滤重复的PID,取TIME排序后的最新的值

    select m.pid from(select pid ,row_number() OVER(PARTITION BY pid ORDER BY  time desc) as pid_row from 表 )m where m.pid_row='1'

    这样就可以取到最新的时间的pid的值了

    展开全文
  • 也就是device_id字段不能重复,消除device_id字段重复的记录,而且device_id对应的检测信息test_result是最新的。   解决思路:用Oracle的row_number() over函数来解决该问题。 解决过程:

    问题:在项目中有一张设备检测信息表DEVICE_INFO_TBL, 每个设备每天都会产生一条检测信息,现在需要从该表中检索出每个设备的最新检测信息。也就是device_id字段不能重复,消除device_id字段重复的记录,而且device_id对应的检测信息test_result是最新的。

     

    解决思路:用Oracle的row_number() over函数来解决该问题。

    解决过程:

     1.查看表中的重复记录

    select
        t.id,
        t.device_id,
        t.update_dtm,
        t.test_result
    from DEVICE_INFO_TBL t
    查看重复数据
     
    2.标记重复的记录
    select
        t.id,
        t.device_id,
        t.update_dtm,
        t.test_result,
        row_number() OVER(PARTITION BY device_id ORDER BY t.update_dtm desc) as row_flg   
    from DEVICE_INFO_TBL t
    标记重复记录
     
    3.过滤重复数据,取得最新的记录
    select
        temp.id,
        temp.device_id,
        temp.update_dtm,
        temp.test_result
    from (
             select
                 t.id,
                 t.device_id,
                 t.update_dtm,
                 t.test_result,
                 row_number() OVER(PARTITION BY device_id ORDER BY t.update_dtm desc) as row_flg   
              from DEVICE_INFO_TBL t ) temp
    where temp.row_flg  = '1'
    过滤重复数据






    row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的).

      与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.

      row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序).

      rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).

      dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .

      lag(arg1,arg2,arg3):
    arg1是从其他行返回的表达式
    arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
    arg3是在arg2表示的数目超出了分组的范围时返回的值

    展开全文
  • oracle过滤重复数据

    千次阅读 2018-11-23 18:03:50
    Distinct,用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同) (1)取一个字段,去除重复项。假设要id这个字段的值:  select distinct name from t1; --能消除重复记录,缺点:但只能取一个字段...

    转自百度

    Distinct,用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同)

    (1)取一个字段,去除重复项。假设要id这个字段的值:

           select distinct name from t1;   --能消除重复记录,缺点:但只能取一个字段;distinct关键字会排序,效率很低     

    (2)取多个字段,去除重复项。假设要同时取id,name这2个字段的值:   

            select distinct id,name from t1; --可以取2个字段,但只能消除这2个字段值全部相同的记录


      所以用distinct无法达到同时取多个字段并去重其中一个字段。用group by可以解决这个问题。

    (3)取多个字段并去重其中一个字段。例如要显示的字段为A、B、C三个,而A字段的内容不能重复可以用下面的语句:
        select A, min(B),min(C),count(*) from [table] where [条件] group by   A  having [条件] order by A desc;

    为了字段名显示明了,可以把

        select A, min(B),min(C),count(*)

    换成

        select A as A, min(B) as B,min(C) as C,count(*) as 重复次数 
    显示出来的字段和排序字段都要包括在group by 中
    但显示出来的字段包有min,max,count,avg,sum等聚合函数时可以不在group by 中
    如上句的min(B),min(C),count(*)
    一般条件写在where 后面
    有聚合函数的条件写在having 后面
        如果在上句中having加 count(*)>1   就可以查出记录A的重复次数大于1的记录
        如果在上句中having加 count(*)>2   就可以查出记录A的重复次数大于2的记录
    ☆如果在上句中having加 count(*)>=1   就可以查出所有的记录,但重复的只显示一条,并且后面有显示重复的次数

    ----这就是所需要的结果,而且语句可以通过hibernate

    下面语句可以查询出那些数据是重复的:
         select [字段1],[字段2],count(*) from [表名] group by [字段1],[字段2] having count(*) > 1;
    将上面的>号改为=号就可以查询出没有重复的数据了。例如找出没有重复的gkrq字段值的记录:

        select count(*) from (select gcmc,gkrq,count(*) from gczbxx_zhao t group by gcmc,gkrq having  count(*)>=1 order by GKRQ);
    推荐使用:

        select * from gczbxx_zhao where viewid in ( select max(viewid) from gczbxx_zhao group by gcmc ) order by gkrq desc;

     

     例子2:

    SELECT ROWID,EMPNO,JOB FROM EMP
      WHERE ROWID!=(SELECT MAX(ROWID) FROM EMP D
      WHERE  EMP.JOB=D.JOB)
    ORDER BY JOB;

    举例解释: 
    假设现在EMP表有三条记录,分别为a(rowid=1),b(rowid=2),b(rowid=3)。(b存在重复) 
    那么where语句中, 
    对于记录a来说,只有一条记录,其rowid为1,而关联的D的max(rowid)也为1,由于1=1,所以条件不成立,记录a不会被检出; 
    对于记录b来说,由于存在2条记录,rowid分别为2和3,而关联的D的max(rowid)也为3(2小于3),所以rowid为2的记录满足条件(2<>3),rowid为2的b记录会被检出,rowid为3的记录不会被检出。 
    故对于以上,查询结果就是b(rowid=2)。 
    
    总结:此语句对于任何存在件数为n(n>=1)的记录来说,必将有n-1条记录被检出。

     

     

    展开全文
  • 也就是device_id字段不能重复,消除device_id字段重复的记录,而且device_id对应的检测信息test_result是最新的。   解决思路:用Oracle的row_number() over函数来解决该问题。 解决过程:
  • -- Create table create table TEST ( ID NUMBER, NUM NUMBER ); ID NUM 1 1 1 2 1 3 1 4 2 1 2 2 2 3 ...select t.id, t.num, row_number() over(pa...
  • Oracle过滤重复数据,取最新的数据

    千次阅读 2018-04-15 10:53:53
    也就是device_id字段不能重复,消除device_id字段重复的记录,而且device_id对应的检测信息test_result是最新的。 解决思路:用Oracle的row_number() over函数来解决该问题。 解决过程: 1.查...
  • 最近做项目,发现oracle中存在重复数据,导致项目查询结果冗余,特此需要对数据进行去重。比如下面截图所示: 场景一:根据单个字段(Id)来判断重复记录 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)...
  • select  *  from  ( select  row_.*, ... rownum rownum_ ...数据量不是一条两条,而是很多条,需要分页显示,而上面这个sql语句是最常用的分页方式,而rownum是一个伪列,而我们经常误认为我们...则会出现重复数据
  • select * from t_case where CAR_NUMBER in (select CAR_NUMBER from t_case group by CAR_NUMBER having count(CAR_NUMBER) > 1)      DELETE from t_case WHERE (CAR_NUMBER) IN ( SELECT CAR_NUMBER
  • 几个删除重复记录的SQL语句  1.用rowid方法  2.用group by方法  3.用distinct方法  1。用rowid方法
  • oracle重复数据查询

    2019-08-28 15:52:00
    项目遇到一个问题,就是表中虽然有主键,但是有除了主键外的其他字段重复数据,而我们需要过滤重复数据 。 select distinct A,B,C,D from table;不能满足目标需求。 如果你有主键,去重后结果集: SELECT * ...
  • 我们在项目中肯定会遇到一种情况,就是表中没有主键 有重复数据 或者有主键 但是部分字段有重复数据 而我们需要过滤重复数据 下面是一种解决方法 delete from mytest ms where rowid in (select aa.rid ...
  • 此时我们就需要使用distinct关键字,这个关键字在查询的时候会帮助我们自动过滤具有相同属性的数据,如:select count(distinct SM_ID) from DUAL此时我们在统计SM_ID的数量时,将会...因此,我们便可以去除重复数据
  • 实际 上我要的效果是不是重复的直接取出来,重复的按照时间最大最小获取一条 最后的结果应该是这样的 方法1 先按照房间类型分组,然后取出每组里面最大的时间,就行了 SELECT s.ROOM_TYPE_ID,s.ROOM_NUMBER,(s....
  • 查询重复数据 -- 假设 ID 重复 SELECT ID FROM your_table GROUP BY ID HAVING COUNT(ID)>1; 去重,保留ROWID最小的数据 DELETE FROM your_table a WHERE a.id IN ( SELECT ID FROM your_...
  • select distinct fieldName from tableName --利用distinct来过滤 oracle Extract 函数 //oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分 //语法如下: EXTRACT ( ...
  • 查询1.1语法1.2简单查询1.2.1选择全部列1.2.2选择指定列1.3使用数字运算符1.4空值(null)1.5列的别名1.6连接符1.7字符串1.8不重复的行2.过滤2.1语法2.2比较运算2.2.1简单运算符2.2.2其它运算符2.2.2.1BETWEEN...AND.....
  • 更新日志: [2019-10-17] 文章发布 说明: 本文地址 《》https:// 关于 MaiXiaochai CSDN:https://blog.csdn.net/maixiaochai ...1. 查询重复数据的唯一字段(这里用ID) SELECT ID FROM your_tab...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,608
精华内容 14,243
关键字:

oracle查询过滤重复数据