【发布时间】:2020-03-26 11:44:10
【问题描述】:
这就是我所拥有的 - 一个检索所有具有重复电子邮件地址的人的查询相信排名超过分区应该解决我的问题(过滤器是电子邮件地址)
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
这是查询Query Result的输出
我想要什么 - 下面的查询检索具有重复 EmailAddresses 的用户,我想保留每封电子邮件的最新记录,如果电子邮件当然属于同一个 UserId,想象一下是 5 封重复的电子邮件,如果我验证这 5 封重复的邮件属于同一个用户 ID,我想根据 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
如果电子邮件属于同一个 UserId,我想保留每封电子邮件的最新记录,假设有 5 封重复的电子邮件,如果我验证这 5 个重复的电子邮件属于同一个 UserId,我想保留最新记录基于 CreatedOn 字段。
更新:刚刚通过查询更新了我的分区,但它仍然无法对显示的值进行排名
【问题讨论】:
-
样本数据和期望的结果会有所帮助。您的第一个查询太复杂了。
-
我在查询结果中附上了一张图片
-
在
PARTITION BY和ORDER BY子句中使用相同的表达式几乎总是错误的 - 因为根据定义,每个分区中的所有行必须具有完全相同的值 表示该表达式。
标签: sql sql-function ranking-functions