【问题标题】:Rank() Over Partition By to rank over a table column to give me the older recordsRank() Over Partition By 对表列进行排名以给我较旧的记录
【发布时间】: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 BYORDER BY 子句中使用相同的表达式几乎总是错误的 - 因为根据定义,每个分区中的所有行必须具有完全相同的值 表示该表达式。

标签: sql sql-function ranking-functions


【解决方案1】:

如果您想要属于多个用户的电子邮件地址,您可以使用:

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;

【讨论】:

  • 附上一张新图片,因为如果电子邮件属于同一 UserId,我想保留每封电子邮件的最新记录,假设有 5 封重复的电子邮件,如果我验证这 5 个重复属于到相同的 UserId 我想根据 CreatedOn 字段保留最新记录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 2012-11-04
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多