2017-02-22 109 views
0

我正在執行一個查詢,並得到一個結果集,其中有兩個幾乎相同的行,其中只有一個列值不同 - 'EXPLICIT_PERM'。丟棄幾乎相同的行集

查詢本身很長,我不能在這裏發佈它,但我可以說查詢中'EXPLICIT_PERM'的值是作爲另一列值的結果而確定的,它的結構如下所示:

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

該查詢返回許多結果,但在極少數情況下可能發生此重複情況。

QUERY RESULTS

有沒有辦法,如果我得到兩個相同的SERVER_IDs我可以檢查和丟棄的結果,包含「0」作爲EXPLICIT_PERM?

+1

如何簡單地使用外側的位置,我的意思是脫離了union的括號? –

+0

我需要放棄EXPLICIT_PERM = 0的行,只有在服務器ID出現兩次的情況下,我該如何檢測? –

+0

爲什麼你想用PL/SQL(一種編程語言)而不是SQL來解決這個問題? –

回答

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 = 1爲每server_id,然後排除所有explicit_perm = 0和至少一行行與explicit_perm = 1存在相同的server_id

與我的樣本數據,結果:

SERVER_ID SERVER_ EXPLICIT_PERM  RANK  TOTAL 
---------- ------- ------------- ---------- ---------- 
     11 ZZZZZZZ    1   2   22 
     11 ZZZZZZZ    1   1   11 
     11 XXXXXXX    1   1   10 
     22 YYYYYYY    0   1   10 
     93 AVIZNER    1   1   10 
+0

完美地工作,謝謝。 –

+0

我剛剛注意到,將這添加到我的查詢後,ORDER BY我執行得到了混亂。我不按'server_id'列排序,但是當我從查詢中刪除這部分時,訂單恢復正常。任何想法爲什麼? –

+1

在外部查詢中,不能依賴沒有ORDER BY的順序。如果您需要訂購某些條件,唯一安全的方法是在查詢中添加ORDER BY子句以包裝您最初的查詢。 – Aleksej

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; 
0

除了所有其他有趣的解決方案。我們也可以嘗試group by子句

SELECT service_id, 
     server_nam, 
     max(explicit_perm) explicit_perm, 
     rank, 
     total 
FROM ((QUERY1)UNION ALL (QUERY2) UNION ALL (QUERY3)) 
group by service_id, server_nam, rank, total; 
相關問題