Rank () Over Partition By, чтобы ранжировать столбец таблицы, чтобы получить более старые записи - PullRequest
0 голосов
/ 26 марта 2020

Это то, что у меня есть - запрос, который извлекает всех лиц с дублированным адресом электронной почты, которые считают, что ранжирование по разделу должно решить мою проблему (фильтр - это адрес электронной почты)

SELECT a.Id, a.EmailAddress,a.UntilDate,a.CreatedOn,a.UserId
    INTO #GetEmployeesWithDuplicateEmails
    FROM Employee a
    INNER JOIN (SELECT                    
                    Employee.EmailAddress as EmailAddress                
                FROM Employee
                GROUP BY Employee.EmailAddress
                HAVING count(Employee.EmailAddress) > 1
                    ) b
    ON a.EmailAddress = b.EmailAddress
    ORDER BY a.Id

это вывод запроса Результат запроса

Что я хочу - Запрос ниже возвращает пользователей, которые дублировали адреса электронной почты, я хочу сохранить Самая последняя запись по каждому электронному письму. Если электронная почта принадлежит одному и тому же идентификатору пользователя, конечно, представьте, что есть 5 дублированных электронных писем, если я проверяю, что эти 5 дубликатов принадлежат одному и тому же идентификатору пользователя, я хочу сохранить самую новую запись на основе поля CreatedOn остальные 4 будут обновлены. Я хотел использовать ранжирование по разделам, но в любом случае вы можете посоветовать мне лучший сценарий:

    SELECT          #GetEmployeesWithDuplicateEmails.*,
                RANK() OVER (
                PARTITION BY #GetEmployeesWithDuplicateEmails.CreatedOn
                 ORDER BY #GetEmployeesWithDuplicateEmails.CreatedOn DESC) createdon_rank               
INTO         #TableValuesToDelete 
FROM        #GetEmployeesWithDuplicateEmails 
INNER JOIN
(  
  (SELECT #GetEmployeesWithDuplicateEmails.[EmailAddress]
    FROM #GetEmployeesWithDuplicateEmails
    GROUP BY #GetEmployeesWithDuplicateEmails.[EmailAddress])
) as temp2 ON #GetEmployeesWithDuplicateEmails.[EmailAddress]=temp2.[EmailAddress]

update 
        #TableValuesToUpdate
SET
        #TableValuesToUpdate.EmployedUntilDate=getDate()
WHERE
        created_rank > 1

я хочу сохранить самую последнюю запись по каждому письму, если письмо принадлежит одному и тому же идентификатору пользователя , Представьте, что есть 5 дублированных электронных писем, если я проверяю, что эти 5 дубликатов принадлежат одному и тому же UserId, я хочу сохранить самую новую запись, основанную на поле CreatedOn.

Обновление: Только что обновил мой раздел по запросу, но он по-прежнему не может ранжировать отображаемые значения

1 Ответ

0 голосов
/ 26 марта 2020

Если вы хотите, чтобы адреса электронной почты принадлежали нескольким пользователям, вы можете использовать:

select e.*
from Employee e
where exists (select 1
              from Employee e2
              where e2.EmailAddress = e.EmailAddress and
                    e2.id <> e.id  -- or however you identify the same employee
            )
order by e.EmailAddress;
...