丢弃几乎相同的行集

时间:2017-02-22 06:38:00

标签: sql oracle

我正在执行一个查询,并且我得到一个结果集,其中我有两个几乎相同的行,其中只有一个列值不同 - ' EXPLICIT_PERM'。

查询本身很长,我无法在此发布,但我可以说' EXPLICIT_PERM'在查询中确定是另一列的值的结果,其结构如下:

SELECT * FROM ((QUERY1)UNION ALL (QUERY2) UNION ALL (QUERY3));

查询返回许多结果,但在极少数情况下会出现此重复方案。

QUERY RESULTS

有没有办法可以检查我是否得到两个相同的SERVER_ID并丢弃包含的结果' 0'如EXPLICIT_PERM?

3 个答案:

答案 0 :(得分:2)

如果我理解得很好,这可能是一种方式。 假设您已经让r查询给出结果,您可以这样包装:

with yourResult(server_id, server_name, explicit_perm, rank, total) as (
    select 93, 'AVIZNER', 1, 1, 10 from dual union all
    select 93, 'AVIZNER', 0, 6, 10 from dual union all
    select 11, 'XXXXXXX', 1, 1, 10 from dual union all
    select 22, 'YYYYYYY', 0, 1, 10 from dual union all
    select 11, 'ZZZZZZZ', 1, 1, 11 from dual union all
    select 11, 'ZZZZZZZ', 1, 2, 22 from dual union all
    select 11, 'ZZZZZZZ', 0, 1, 10 from dual
)
select server_id, server_name, explicit_perm, rank, total
from (
        select server_id, server_name, explicit_perm, rank, total,
               count ( case when explicit_perm = 1 then 1 end) over ( partition by server_id) as count_perm_1
        from yourResult
     )
where not ( explicit_perm = 0 and count_perm_1 > 0)     

这会计算每explicit_perm = 1server_id行的行数,然后排除explicit_perm = 0explicit_perm = 1至少有一行的行相同{的{1}}。

我的样本数据的结果:

server_id

答案 1 :(得分:1)

典型的方法是对结果行进行排名(在每个SERVER_ID的情况下)并且只保留最佳排名。您可以使用ROW_NUMBER执行此操作。

select *
from
(
  select 
    row_number() over (partition by server_id order by explicit_term desc) as rn,
    q.*
  from (<your query>) q
)
where rn = 1;

答案 2 :(得分:0)

除了所有其他有趣的解决方案。我们也可以尝试分组

android:layout_width="0dp"