处理重复配置

时间:2015-01-13 11:00:57

标签: sql sql-server plsql

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

No. Parameter   STATUS
1   STO         INACTIVE
2   STO         ACTIVE
3   BOS         ACTIVE
4   KYC         INACTIVE
5   KYC         INACTIVE
6   ACC         ACTIVE
7   ACC         ACTIVE

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

No. Parameter   STATUS
2   STO         ACTIVE
3   BOS         ACTIVE
4   KYC         INACTIVE
6   ACC         ACTIVE

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

  1. 条件 - 对于相同参数的两种情况,如果STATUS为 ACTIVE - 请先选择 ACTIVE

  2. 条件 - 对于相同参数的两种情况,如果STATUS为 INACTIVE - 请先选择 INACTIVE

  3. 条件 - 如果状态有效&相同参数的非活动 - 选择 ACTIVE

  4. 请帮助我在我的程序中使用相同的查询。

3 个答案:

答案 0 :(得分:1)

我认为你可以通过条件聚合做你想做的事情:

select parameter,
       max(case when min(status) = max(status) then max(status) else 'ACTIVE' end) as status,
       coalesce(min(case when status = 'ACTIVE' then id end), min(id)) as id
from table t
group by parameter;

此类优先级划分的另一种方法是使用row_number()

select parameter, status, id
from (select t.*,
             row_number() over (partition by parameter
                                order by status asc, id
                               ) as seqnum
      from table t
     ) t
where seqnum = 1;

注意:order by status asc使用ACTIVEINACTIVE之前按字母顺序排列的事实。这只是整合逻辑的最简单方法。

编辑(来自Silvain):

SQL小提琴是here

答案 1 :(得分:0)

一种方法是UNION ALL解决方案,第一部分选择ACTIVE行,第二部分仅在没有活动存在时选择INACTIVE位:

select No, Parameter, STATUS from table
where status = 'ACTIVE'
UNION ALL
select No, Parameter, STATUS from table t
where status = 'INACTIVE' and not exists (select * from table
                                          where parameter = t.parameter
                                            and status = 'ACTIVE')
order by no, parameter

或者,或许更好 - 现在改进了

select MIN(No) as No, Parameter, STATUS
from table t
where status = 'ACTIVE' or not exists (select * from table
                                       where parameter = t.parameter
                                         and status = 'ACTIVE')
group by Parameter, STATUS
order by no, parameter

答案 2 :(得分:0)

我在CURSOR中使用了以下查询



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; 




我能够检索数据,但我还想要两个列数据(一个是唯一约束)。 我使用下面的代码 -



CURSOR cCnfgTypData IS
  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.条件 - 如果STATUS对于相同参数的两种情况都是活动的 - 选择首先进入活动

2.Condition - 如果STATUS对于同一参数的两种情况都是非活动的 - 选择第一次来INACTIVE

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

NOte - 这里,xml_configuration_id包含UNIQUE DATA