2011-09-19 77 views
0

我試圖通過與所有其他活躍的組進行比較來確定可以在組94中找到多少個重複的工作電話。使用cte通過與其他組比較來查找重複的電話

  • 聯繫人正在使用的GroupId
  • 的ContactTable只包含IDS和NOT電話
  • 的DetailedContactTable包含手機
  • 的ContactSummaryTable包含組狀態

的SQL,則通過設置ROWNUMBER工作分組對於每個重複的工作電話> 1.

問題是除了94以外,所有組別的人數均大於1。我首先需要知道94。任何想法如何設置rownumber> 1爲重複在GroupId 94首先?

DECLARE @GroupID Int 
SET @GroupID = 94 


;WITH cte AS 
(
    SELECT ROW_NUMBER() OVER (PARTITION BY d.WorkPhone ORDER BY c.id DESC) 
    AS rownumber 
    ,d.WorkPhone 
    ,c.id 
    ,GroupID 
    FROM ContactTable c 
    INNER JOIN DetailedContactTable d 
    ON c.DetailedContactId = d.id 
    WHERE c.GroupID IN 
    (
     SELECT id 
      FROM ContactSummaryTable WHERE id = @GroupID 
      OR GroupActive = 1 
    ) 
    AND NOT d.WorkPhone IS NULL 
    AND d.WorkPhone <> '' 
) 
SELECT * FROM cte WHERE rownumber > 1 
ORDER BY GroupID; 

回答

2
DECLARE @GroupID INT; 
SET  @GroupID = 94; 

WITH BaseGroup 
AS 
(
SELECT c.GroupID 
     ,d.WorkPhone 
     ,c.id ContactID 
FROM ContactTable c 
INNER JOIN DetailedContactTable d ON c.DetailedContactId = d.id 
WHERE c.GroupID = @GroupID 
AND  NOT d.WorkPhone IS NULL 
AND  d.WorkPhone <> '' 
), 
OtherGroups 
AS 
(
SELECT 
     d.WorkPhone 
FROM ContactTable c 
INNER JOIN DetailedContactTable d ON c.DetailedContactId = d.id 
WHERE c.GroupID <> @GroupID 
AND  NOT d.WorkPhone IS NULL 
AND  d.WorkPhone <> '' 
AND  EXISTS (
      SELECT * 
      FROM ContactSummaryTable WHERE id = c.GroupID 
      AND GroupActive = 1) 
) 
SELECT a.* 
FROM BaseGroup a 
INNER JOIN OtherGroups b ON a.WorkPhone = b.WorkPhone 
ORDER BY a.WorkPhone 

SELECT a.*, CASE WHEN b.WorkPhone IS NULL THEN 'no duplicate' ELSE 'duplicate' END [Status] 
FROM BaseGroup a 
LEFT JOIN OtherGroups b ON a.WorkPhone = b.WorkPhone 
ORDER BY a.WorkPhone 
+0

WHERE ID = @GroupID AND GroupActive = 1不能與與被設置。因爲我試圖將其他組與94比較,而不是94與94比較。 –

+0

(1)因此,您想要從GroupID <> 94中找到GroupID = 94的所有工作電話嗎? (2)或者您想查找GroupID => 94中存在的所有來自GroupID = 94的重複工作電話嗎? –

+0

我想比較所有其他活動組的GroupId = 94。 –