【问题标题】:SQL Find duplicates and update valueSQL 查找重复项并更新值
【发布时间】:2021-07-03 09:53:33
【问题描述】:

我有一个表,其中包含重复的姓名和电子邮件,但具有不同的标识符和其他相关数据。在这种情况下,标识符不必必须是唯一的。以下是数据示例:

course user_code First Name Last Name Email Address
econ SKNKZ62HR28 John Doe john.doe@gmail.com
lang C6NV4LQS5D4 John Doe john.doe@gmail.com
science H9NNVNWVPM9 Fred Doe fred.doe@gmail.com
govt JVNH2BVTD3V Jane Doe jane.doe@gmail.com
math L2NK8S49N5G Jane Doe jane.doe@gmail.com

我需要做的是更新 user_code 以便 John Doe 对两门课程都有相同的 user_code

course user_code First Name Last Name Email Address
econ SKNKZ62HR28 John Doe john.doe@gmail.com
lang SKNKZ62HR28 John Doe john.doe@gmail.com
science H9NNVNWVPM9 Fred Doe fred.doe@gmail.com
govt L2NK8S49N5G Jane Doe jane.doe@gmail.com
math L2NK8S49N5G Jane Doe jane.doe@gmail.com

我已经能够使用此代码识别我的重复项:

SELECT a.*
FROM attendees a
JOIN 
    (SELECT [Email Address], [Last Name], [First Name], COUNT(*) AS number
     FROM attendees 
     GROUP BY [Email Address], [Last Name], [First Name]
     HAVING count(*) > 1) b ON a.[Email Address] = b.[Email Address]
                            AND a.[Last Name] = b.[Last Name]
                            AND a.[First Name] = b.[First Name]
ORDER BY a.[Email Address]

我不确定接下来的步骤。

【问题讨论】:

  • 谢谢。更新标签。 SQL-服务器

标签: sql sql-server


【解决方案1】:

如果你只是想让一个查询返回一个结果集,你可以使用:

select a.*,
       max(user_code) over (partition by firstname, lastname, emailaddress) as imputed_user_code
from attendees a;

进行更新的最佳方式取决于数据库。方括号表示具有可更新 CTE 的 SQL Server。这允许:

with toupdate as (
      select a.*,
             max(user_code) over (partition by firstname, lastname, emailaddress) as imputed_user_code
      from attendees a
     )
update toupdate
     set user_code = imputed_user_code
     where user_code <> imputed_user_code;

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 2020-06-04
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多