我有一张包含以下记录的表格
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 选择数据。
条件 - 对于相同参数的两种情况,如果STATUS为 ACTIVE - 请先选择 ACTIVE
条件 - 对于相同参数的两种情况,如果STATUS为 INACTIVE - 请先选择 INACTIVE
条件 - 如果状态有效&相同参数的非活动 - 选择 ACTIVE
请帮助我在我的程序中使用相同的查询。
答案 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
使用ACTIVE
在INACTIVE
之前按字母顺序排列的事实。这只是整合逻辑的最简单方法。
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