Найти дубликаты телефонов с помощью cte, сравнивая с другими группами - PullRequest
0 голосов
/ 19 сентября 2011

Я пытаюсь определить, сколько дубликатов рабочих телефонов я могу найти в группе 94, сравнивая их со всеми другими активными группами.

  • Контакты сгруппированы с использованием GroupId
  • Контактная таблица содержит только идентификаторы, а НЕ телефоны
  • ПодробнаяКонтактная таблица содержит телефоны
  • Таблица контактов содержит статус группы

sql работает, устанавливая число для каждого дублированного рабочего телефона> 1.

Проблема заключается в том, что задается общее число> 1 для всех групп, кроме 94. Мне нужно в первую очередь знать 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;

1 Ответ

2 голосов
/ 19 сентября 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...