Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL server副本保留最新的_Sql Server - Fatal编程技术网

Sql server SQL server副本保留最新的

Sql server SQL server副本保留最新的,sql-server,Sql Server,请您帮助cte获取以下数据集中的重复记录并使其处于非活动状态,最新日期记录应保持活动状态 如果Fname、Lname和电子邮件相同-重复 如果Fname、Lname和phone相同-重复 如果custA和custb与custb有相同的电话号码,cust c有相同的电子邮件,则custc是cust a的副本(a=b=c,) 如果Fname、Lname、电子邮件和电话相同-重复 此处的输出应为仅cust 100应处于活动状态 多谢各位 CustID Fname Lname Phone

请您帮助cte获取以下数据集中的重复记录并使其处于非活动状态,最新日期记录应保持活动状态

  • 如果Fname、Lname和电子邮件相同-重复
  • 如果Fname、Lname和phone相同-重复
  • 如果custA和custb与custb有相同的电话号码,cust c有相同的电子邮件,则custc是cust a的副本(a=b=c,)
  • 如果Fname、Lname、电子邮件和电话相同-重复
  • 此处的输出应为仅cust 100应处于活动状态 多谢各位

    CustID  Fname   Lname   Phone       Email     Date      Active
    100     John      Doe   1234567890  NULL      10-Jan      1
    200     John      Doe   1234567890  a@a.com   2-Jan       1
    300     John      Doe   NULL        a@a.com   1-Jan       1
    

    此查询将返回应保持活动状态的行:

    WITH 
      t AS (
        SELECT *
        FROM (
          VALUES 
            (100, 'John', 'Doe', 1234567890, NULL,      CAST('2017-01-10' AS DATE)),
            (200, 'John', 'Doe', 1234567890, 'a@a.com', CAST('2017-01-02' AS DATE)),
            (300, 'John', 'Doe', NULL,       'a@a.com', CAST('2017-01-01' AS DATE))
        ) t(CustID, Fname, Lname, Phone, Email, Date)
      ),
      u AS (
        SELECT Fname, Lname, Phone, COALESCE(MAX(Email), Phone) AS Email, MAX(Date) AS Date
        FROM t
        GROUP BY Fname, Lname, Phone 
      ),
      v AS (
        SELECT Fname, Lname, COALESCE(MAX(Phone), Email) AS Phone, Email, MAX(Date) AS Date
        FROM u
        GROUP BY Fname, Lname, Email 
      )
    SELECT *
    FROM t
    WHERE EXISTS (
      SELECT 1
      FROM v
      WHERE t.Fname = v.Fname
      AND t.Lname = v.Lname
      AND t.Date = v.Date
    )
    
    说明:
    • t
      表只是您的数据
    • u
      表查找每个
      Fname、Lname、Phone
      组的最近日期(
      MAX(date)
      )。它还假设,如果该组在至少一条记录上包含
      电子邮件
      MAX(Email)
      ),则该
      电子邮件
      属于该组。根据您的描述,这样的
      电子邮件只能有一封
      ,因此我们可以使用
      MAX()
    • v
      表通过
      Fname、Lname、Email
      进行相同但相反的分组,查找该组中的最近日期
    • 最后,我们只保留
      t
      中的记录(原始数据),该记录与最近每组记录的
      Fname、Lname、Date
      值相匹配
    正在更新
    活动
    标志 查询几乎相同:

    WITH 
      u AS (
        SELECT Fname, Lname, Phone, COALESCE(MAX(Email), Phone) AS Email, MAX(Date) AS Date
        FROM t
        GROUP BY Fname, Lname, Phone 
      ),
      v AS (
        SELECT Fname, Lname, COALESCE(MAX(Phone), Email) AS Phone, Email, MAX(Date) AS Date
        FROM u
        GROUP BY Fname, Lname, Email 
      )
    UPDATE t
    SET active = 0
    OUTPUT INSERTED.*
    WHERE NOT EXISTS (
      SELECT 1
      FROM v
      WHERE t.Fname = v.Fname
      AND t.Lname = v.Lname
      AND t.Date = v.Date
    )
    
    UPDATE
    语句的输出显示修改后的数据:


    是否保证至少有一个电话或电子邮件是非空的?是的,至少有一个电话或电子邮件应该存在,以便将记录输入表中,但这两个记录也可以存在,谢谢谢谢你,卢卡斯,我会测试并返回,但这肯定为我今后的方向提供了一个很好的方向。感谢您的帮助Hi Lukas,查询工作很好。我对在最后阶段加入date有点困惑。你能解释一下吗?这里date有时可能为null,我计划采用更新的date列值,以防实际代码中的date列变为null。我们是否根据日期作为连接条件之一来确定唯一性?您可以通过编写类似于
    COALESCE(t.date,somedate)=COALESCE(v.date,somedate)
    的内容来解决可为空的日期问题。是的,唯一性取决于现在的日期。如果你可能有多个“最近的日期”,你需要选择一个,也有一个解决办法,但它更复杂。