在Oracle SQL中处理重复记录

时间:2015-01-14 11:02:35

标签: sql oracle

我有一张包含以下记录的表格

NAME        STATUS          xml_configparamdb_id      xml_configuration_id
STO         INACTIVE                  1                        1
STO         ACTIVE                    1                        2
BOS         ACTIVE                    1                        3
KYC         INACTIVE                  1                        4 
KYC         INACTIVE                  1                        5
ACC         ACTIVE                    1                        6
ACC         ACTIVE                    1                        7

现在我感兴趣的结果如下:

NAME        STATUS          xml_configparamdb_id      xml_configuration_id

STO         ACTIVE                    1                        2
BOS         ACTIVE                    1                        3
KYC         INACTIVE                  1                        4 
ACC         ACTIVE                    1                        6

也就是说,我想根据STATUS选择数据。

  1. 条件 - 如果STATUS对于相同参数的两种情况都是活动的 - 选择首先进入活动

  2. 条件 - 如果同一参数的两种情况的STATUS都是非活动的 - 请先选择INACTIVE

  3. 条件 - 如果STATUS是ACTIVE&相同参数的INACTIVE - 选择ACTIVE

  4. 现在我使用下面的查询来填充上面的结果而不使用PRIMARY KEY列(xml_configuration_id)

    CURSOR cCnfgTypData IS
      select distinct name, description, STATUS
      from stg_xml_cpdb_configuration
      WHERE process_exec_num = 1
      AND STATUS = 'ACTIVE'
      UNION ALL
      select name, description, STATUS
      from stg_xml_cpdb_configuration t
      where process_exec_num = 1
      and STATUS = 'INACTIVE'
      and not exists (select * from stg_xml_cpdb_configuration
      where name = t.name 
      and STATUS = 'ACTIVE') order by name, description; 
    

    它显示了良好的数据。但是当我使用PRIMARY KEY Column(xml_configuration_id)执行时,它会显示所有数据而不满足条件

      select distinct name, description, STATUS, xml_configparamdb_id, xml_configuration_id
      from stg_xml_cpdb_configuration
      WHERE process_exec_num = 1
      AND STATUS = 'ACTIVE'
      UNION ALL
      select name, description, STATUS, xml_configparamdb_id, xml_configuration_id
      from stg_xml_cpdb_configuration t
      where process_exec_num = 1
      and STATUS = 'INACTIVE'
      and not exists (select * from stg_xml_cpdb_configuration
      where name = t.name 
      and STATUS = 'ACTIVE') order by name, description; 
    

1 个答案:

答案 0 :(得分:0)

使用分析函数ROW_NUMBER

SQL> SELECT name,
  2    status,
  3    xml_configparamdb_id,
  4    xml_configuration_id
  5  FROM
  6    ( SELECT t.*, row_number() over (partition BY name order by status) rn FROM t
  7    )
  8  WHERE rn = 1
  9  ORDER BY xml_configuration_id
 10  /

NAM STATUS   XML_CONFIGPARAMDB_ID XML_CONFIGURATION_ID
--- -------- -------------------- --------------------
STO ACTIVE                      1                    2
BOS ACTIVE                      1                    3
KYC INACTIVE                    1                    4
ACC ACTIVE                      1                    6

SQL>