2016-06-10 34 views
1

我正在嘗試使用partition by clause從數據庫中刪除記錄這是我爲了重複數據刪除而運行的查詢。它對人口最多,記錄最高的記錄進行排名。通過使用多個case語句進行分區

WITH cteDupes AS 
(
-- 
-- Partition based on contact.owner and email 
    SELECT ROW_NUMBER() OVER(PARTITION BY contactowner, email 
ORDER BY 
-- ranking by populated field 
    case when otherstreet is not null then 1 else 0 end + 
    case when othercity is not null then 1 else 0 end 
) AS RND, * 
    FROM scontact 
    where (contact_owner_name__c is not null and contact_owner_name__c<>'') and (email is not null and email<>'') 
) 
--Rank data and place it into a new table created 
select * into contact_case1 
from cteDupes 
WHERE RND=1; 

我想知道它是否可以通過使用大小寫進行分區。例如,目前我正在通過聯繫人和電子郵件進行分區。當contactowner爲空時,我想通過contactofficer進行分區。 我可以創建這樣的病例陳述嗎?或者這是不可能的,因爲排名會在某種程度上被改變。

+0

「當contactowner爲空時,我想通過contactofficer進行分區。」這句話含糊不清。你的意思是說,你想把軍官的價值看作是所有者的價值嗎?在那種情況下,你不想通過聯繫人員進行分區,而是希望由所有者進行分區,但這些仍然是不同的實體,不會混合? –

回答

2

您可以使用case,但我認爲coalesce()在這種情況下簡單:

SELECT ROW_NUMBER() OVER (PARTITION BY COALESCE(contactowner, contactofficer), email 
          . . . 

如果你想聯繫和人員使用相同的名稱將被單獨計算,那麼你會怎麼做:

SELECT ROW_NUMBER() OVER (PARTITION BY (CASE WHEN contactowner is NULL then 1 else 2 end), 
             contactowner, 
             (CASE WHEN contactowner is null THEN contactofficer END), 
             email 
          . . . 
+1

這將與'(X,Y)'的'(contactowner,contactofficer)'在與'(NULL,X)'相同的組中組合一行,我不確定是否需要。 –

+0

@MartinSmith。 。 。這似乎是OP要求的。 –

+0

謝謝,這就是我一直在尋找的 –

1

因此,如果contactOwner爲空,那麼ContactOfficer只能用於分區目的?

在這種情況下,您可以使用。

PARTITION BY contactowner, 
      CASE WHEN contactOwner IS NULL THEN contactofficer END, 
      email . . .