精华内容
下载资源
问答
  • Oracle 去重查询

    2018-02-28 15:42:00
    Oracle 去重查询 CreateTime--2018年2月28日15:38:45 Author:Marydon (一)使用distinct --查询指定区间内表停诊字段的值 SELECT DISTINCT T.CLOSE_TZ FROM CONSULT_SCHEDULE T WHERE T.SCHEDULE_DATE ...
     

    Oracle 去重查询

    CreateTime--2018年2月28日15:38:45

    Author:Marydon

    (一)使用distinct

    --查询指定区间内表停诊字段的值
    SELECT DISTINCT T.CLOSE_TZ
      FROM CONSULT_SCHEDULE T
     WHERE T.SCHEDULE_DATE BETWEEN TO_DATE('2018-01-01', 'yyyy-MM-dd') AND
           TO_DATE('2018-02-28', 'yyyy-MM-dd');

    说明:

      使用distinct关键字,后面跟一个字段,则只对该字段的值进行去重;

      后面跟2个字段,则表示column1+column2两个字段不完全一致进行去重。

    (二)对指定字段去重后,再查出该行数据的其他字段信息

    UpdateTime--2017年7月10日10:54:20

    1.2.5 对某字段进行去重后,根据这个字段查出在表中所对应的记录

    实例1: 查询指定医院对应科室下属的医生(需要去重)

    查询结果字段:医生id,医生姓名,医疗机构id,科室id

      sql1:没有根据医生id进行去重,只查出了所需字段

    --查询排班表中字段:医生ID,医生姓名,医疗机构ID,科室ID
    SELECT T.DOCTOR_ID    AS FDOCTORCODE,
           T.DOCTOR_NAME  AS FDOCTORNAME,
           T.DOCTOR_PHONE AS FDOCTORPHONE,
           T.ORG_ID       AS FORGID,
           T.DEPENT_ID    AS FDEPTCODE
      FROM CONSULT_SCHEDULE T
     WHERE ORG_ID = '416211338'
       AND DEPENT_ID = '1004'

      查询结果:有很多重复记录

     

      sql2:根据医生id进行去重,没有查出所需字段

    --实现效果:根据已知条件对医生id进行去重查询
    --查询条件:医疗机构id和科室id
    --对查询结果进行分组
    --查询字段:rowid和计数
    --查询结果:查出每组排班信息中取最大的rowid
    SELECT MAX(ROWID),COUNT(1)
      FROM CONSULT_SCHEDULE
     WHERE ORG_ID = '416211338'
       AND DEPENT_ID = '1004'
     GROUP BY DOCTOR_ID 

      查询结果: 按医生id进行分组后,取每组记录中最大的rowid

      sql3:完美实现

    --根据条件(指定医疗机构,指定科室)对医生信息进行去重并查询出指定字段(医生id,医生名称,医生电话,机构id,科室id)
    SELECT T.DOCTOR_ID    AS FDOCTORCODE,
           T.DOCTOR_NAME  AS FDOCTORNAME,
           T.DOCTOR_PHONE AS FDOCTORPHONE,
           T.ORG_ID       AS FORGID,
           T.DEPENT_ID    AS FDEPTCODE
      FROM CONSULT_SCHEDULE T
     WHERE T.ROWID IN (SELECT MAX(ROWID)
                         FROM CONSULT_SCHEDULE
                        WHERE ORG_ID = '416211338'
                          AND DEPENT_ID = '1004'
                        GROUP BY DOCTOR_ID)

      sql4:完美实现

    SELECT T.DOCTOR_ID    AS FDOCTORCODE,
           T.DOCTOR_NAME  AS FDOCTORNAME,
           T.DOCTOR_PHONE AS FDOCTORPHONE,
           T.ORG_ID       AS FORGID,
           T.DEPENT_ID    AS FDEPTCODE
      FROM CONSULT_SCHEDULE T,
           (SELECT MAX(ROWID) ROWID2
              FROM CONSULT_SCHEDULE
             WHERE ORG_ID = '416211338'
               AND DEPENT_ID = '1004'
             GROUP BY DOCTOR_ID) T2
     WHERE T.ROWID = T2.ROWID2

      sql5:推荐使用

    SELECT T.DOCTOR_ID AS FDOCTORCODE,
          max(T.DOCTOR_NAME) AS FDOCTORNAME,
          max(T.DOCTOR_PHONE) AS FDOCTORPHONE,
          max(T.ORG_ID) AS FORGID,
          max(T.DEPENT_ID) AS FDEPTCODE
     FROM CONSULT_SCHEDULE T
    WHERE ORG_ID = '134557'
      AND DEPENT_ID = '1004'
    GROUP BY DOCTOR_ID

     

      查询结果:

      错误实现方式一:

        使用distinct实现

    --错误方式一
    SELECT DISTINCT T.DOCTOR_ID    AS FDOCTORCODE,
                    T.DOCTOR_NAME  AS FDOCTORNAME,
                    T.DOCTOR_PHONE AS FDOCTORPHONE,
                    T.ORG_ID       AS FORGID,
                    T.DEPENT_ID    AS FDEPTCODE
      FROM CONSULT_SCHEDULE T
     WHERE T.ORG_ID = '416211338'
       AND T.DEPENT_ID = '1004' 

      错误结果: 

        错在哪:

           distinct的用法是:

          a.distinct + 单个字段,表示对该字段进行去重处理;

          b.distinct + column1,column2,。。。,表示的是使用n个字段进行联合去重,即查出来的是这n个字段的值相加结果不一致的数据;

             而不是:对第一个字段做去重处理后,再将其他字段查询出来。

        错误实现方式二 

    --错误方式二
    SELECT T.DOCTOR_ID    AS FDOCTORCODE,
           T.DOCTOR_NAME  AS FDOCTORNAME,
           T.DOCTOR_PHONE AS FDOCTORPHONE,
           T.ORG_ID       AS FORGID,
           T.DEPENT_ID    AS FDEPTCODE
      FROM CONSULT_SCHEDULE T
     WHERE T.DOCTOR_ID IN (SELECT DISTINCT T2.DOCTOR_ID
                             FROM CONSULT_SCHEDULE T2
                            WHERE T2.ORG_ID = '416211338'
                              AND T2.DEPENT_ID = '1004')

        错误结果:

        错在哪:

          先用distinct虽然查出来的医生id具有唯一性,但是, 根据这个唯一的医生id结果集去查询其他字段数据的结果无法保证数据的唯一性

        实例2:查CONSULT_SCHEDULE表中字段:医生id,姓名,医疗机构id,科室id并根据医生id去重

          sql实现:

    SELECT T.DOCTOR_ID    AS FDOCTORCODE,
           T.DOCTOR_NAME  AS FDOCTORNAME,
           T.DOCTOR_PHONE AS FDOCTORPHONE,
           T.ORG_ID       AS FORGID,
           T.DEPENT_ID    AS FDEPTCODE
      FROM CONSULT_SCHEDULE T,
           (SELECT MAX(ROWID) ROWID2 FROM CONSULT_SCHEDULE GROUP BY DOCTOR_ID) T2
     WHERE T.ROWID = T2.ROWID2 

          查询结果:

     

     

    转载于:https://www.cnblogs.com/Marydon20170307/p/8483992.html

    展开全文
  • oracle 去重查询

    万次阅读 2018-11-23 10:26:33
    --------------------  原作者:搬长城的红砖  原文:...  oracle 数据库多字段去重 方法介绍:distinct 关键字、group by 、row_number ()over(partition by 列 order by 列 desc) 我的需...

    -------------------- 
    原作者:搬长城的红砖 
    原文:https://blog.csdn.net/yin_jia_521/article/details/72626182 
     

    oracle 数据库多字段去重

    方法介绍:distinct 关键字、group by  、row_number ()over(partition by 列 order by 列 desc)

    我的需求是:根据某几列去重 查询出去重后的全部信息。最后我选择的是第三种方法。


    我的想法:我想找出一种更简单的方法去 实现去重查询。越直接越好。

    表结构&&内容

    1、distinct 关键字的用法:distinct 关键字后面的字段组合去重 distinct 必须

    select distinct id from test

    结果 ;根据id 去重

    select distinct id,name from test

    结果:根据id和name 组合去重(类似于  id || name  这样去重)

    2、group by 分组去重

    select id,name from test group by id,name

    结果:根据id,name 组合去重

    3、row_number ()over(partition by 列 order by 列 asc | desc)方法

    3.1 row_number() over(order by column asc)   先对列column按照升序,再为每条记录返回一个序列号

    3.2 row_number() over(partition by column1 order by column2 asc) 先按照column1分组,再对分组后的数据根据column2 升序排列

    注:order by 必须得有

    例子select a.*,row_number() over(partition by a.id,a.sex order by name) su from test a;

    去重例子:根据 id和sex 去重

    select id,name,sex from(
    select a.*,row_number() over(partition by a.id,a.sex order by name) su from test a )
    where su=1

    结果:

    我的需求是:根据某几列去重 查询出去重后的全部信息。
     

    展开全文
  • Oracle去重查询

    2019-07-25 15:43:26
    1:单列去重查询 select distinct DOMAINNAME from T_ZTK_TYPE where 1=1 2:多列查询,只要DOMAINNAME列查询 SELECT DOMAINNAME, min( DOMAINID ) FROM T_ZTK_TYPE WHERE 1=1 GROUP BY DO...

    1:单列去重查询

    select distinct DOMAINNAME
            from T_ZTK_TYPE
            where 1=1

     

    2:多列查询,只要DOMAINNAME列查询

    SELECT
        DOMAINNAME,
        min( DOMAINID )
    FROM
         T_ZTK_TYPE
    WHERE
        1=1
    GROUP BY
        DOMAINNAME

     

    3:网络上有用的

    https://liubin2010.iteye.com/blog/1130415

    展开全文
  • Oracle去重查询实例

    2020-08-20 00:50:42
    Oracle去重查询实例 今天工作中遇到了一个关于去重的查询,琢磨了半天,终于想明白了,这里简单记录一下。 distinct函数 说到去重,可能第一反应就是distinct函数,但其实distinct只是针对单一字段的去重有效。 ...

    Oracle去重查询实例

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

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

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

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

    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_datephone_number
    2020073112345678910
    2020080612345678910

    可以看出其实同一个号码在不同天的记录都被计入了,这是不行的,我们必须要对这部分进行去重。

    1. Solution:
      可以考虑用max(rowid)来保留重复的其中一项,代码如下:
    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!

    展开全文
  • 关于Oracle开发必备的基础操作 作者:孙夕恩 ...--去重查询方法一:根据id ...select * from sxe where id in(select min(id) from sxe group by username) ...--去重查询方法二:根据rownum select * from (sel
  • oracle去重语句

    2018-01-23 12:48:48
    oracle去重语句 ,批量设置,去除重复以及空格racle去重语句racle去重语句
  • oracle 数据库多字段去重 ...我的想法:我想找出一种更简单的方法去 实现去重查询。越直接越好。 表结构&&内容 1、distinct 关键字的用法:distinct 关键字后面的字段组合去重 distinct 必须 selec...
  • oracle去重

    2015-11-19 09:18:00
    oracle去重 create table tmp_table3 as (SELECT seqno FROM (SELECT t.seqno,ROWID, ROW_NUMBER() OVER(PARTITION BY title, uin ORDER BY createtime) ...
  • ORACLE去重排序

    2021-01-14 19:31:35
    ORACLE去重排序 SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY STATION_NAME ORDER BY ID DESC) RNO,STATION_NAME,ID FROM EMES_MAC) WHERE RNO=1 ORDER BY ID DESC 格式:SELECT * FROM (SELECT ROW_...
  • oracle 去重

    千次阅读 2015-02-05 10:16:48
    oracle去重 1.delete from t where rowid not in (select min(rowid) from t group by 去重字段); 2.(注意:distinct是记录完全一致的重复。而上面是以某一列的值是否重复来决定) insert into 临时...
  • oracle 去重排序

    千次阅读 2018-10-31 16:44:59
    oracle 去重排序 row_number() over(partition by twf.fkid order by twf.createdate desc) as CODE_ID twf.fkid 根据此分组 : twf.createdate 根据此排序
  • oracle 数据库去重查询

    千次阅读 2019-01-31 15:50:00
    oracle数据库中有如下一张表,包含id,loginid,name,researchtime等字段,其中name字段中的数据有重复,查询数据时要重复数据只取一条,利用row_number ()over(partition by 列 order by 列 desc)方法实现 ...
  • Oracle去重

    2019-05-28 13:44:19
    SELECT LONGITUDE,LATITUDE,ID FROM (SELECT W.LONGITUDE,W.LATITUDE,W.ID,ROW_NUMBER() OVER( PARTITION BY W.SHOPNAME ORDER BY W.ID DESC)RN FROM ACW.RESULT W WHERE W.DEPTNAME IS NULL) WHERE RN = 1
  • Oracle 去重

    2017-08-20 20:13:00
    Oracle 删除重复数据只留一条 查询及删除重复记录的SQL语句 -- 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 select * from 表 where Id in (select Id from 表 group byId having count...
  • 【oracle】【sql】oracle去重 20150225_Oracle_去重.sql参考:http://wenku.baidu.com/view/0a362b2003d8ce2f006623e4.html create table t_distinct(c1 ...
  • Oracle去重保留一条

    2019-12-06 10:47:07
    Oracle去重保留一条(本次我们用PARTITION BY分区筛选来解决): select temp.* from (select t.*,row_number() OVER(PARTITION BY NAVLATESTDATE ORDER BY t.id asc) as row_flg from new_fund_net_value_data t )...

空空如也

空空如也

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

oracle去重查询