Mysql 表格之间的差异以及发生了什么变化?

Mysql 表格之间的差异以及发生了什么变化?,mysql,Mysql,我们的营销团队跟踪他们所谓的“关键”客户的活动。数据每周一更新一次,上周的数据归档到“快照”表中。结构很简单 'AccountID','ContactID','Tag','Last Modified Date' '602','31262001','Key','2018-08-07 22:43:57' '608','91285974','Key','2018-08-07 22:43:55' '608','28620737','Key','2018-08-07 22:43:57' '4002','1

我们的营销团队跟踪他们所谓的“关键”客户的活动。数据每周一更新一次,上周的数据归档到“快照”表中。结构很简单

'AccountID','ContactID','Tag','Last Modified Date'
'602','31262001','Key','2018-08-07 22:43:57'
'608','91285974','Key','2018-08-07 22:43:55'
'608','28620737','Key','2018-08-07 22:43:57'
'4002','118697713','Key','2018-09-08 06:46:49'
'9481','112536097','Key','2018-08-07 22:43:56'
每个星期一,我都要汇报工作

  • 上周而非本周的客户帐户
  • 本周而非上周的客户帐户
  • “标记”不是“关键”的客户帐户
  • 对于1)和2),我这样做了

     SELECT t1.*
     FROM current_week t1
     LEFT OUTER JOIN snapshot t2 ON t1.AccountID = t2.AccountID AND t1.ContactID 
     = t2.ContactID
     WHERE t2.Tag = 'Key'
     UNION
     SELECT t2.*
     FROM current_week t1
     RIGHT OUTER JOIN snapshot t2 ON t1.AccountID = t2.AccountID AND t1.ContactID 
     = t2.ContactID
     WHERE t2.Tag = 'Key';
    
    注:出于某种原因,市场营销允许一个帐户使用1:M的ContactID值,这似乎会在我的数据中产生误报。因此我添加了join


    但我不知道该怎么做。有什么想法吗?

    我想你只需要一个
    联合所有人就可以做到这一点

    第一个查询添加快照中缺少的“键”标记,并获取那些不是“键”标记的标记。
    然后让第二个查询只添加那些仅在快照中的查询

    SELECT curr.*
    FROM current_week AS curr
    LEFT JOIN snapshot AS prev ON (prev.AccountID = curr.AccountID AND prev.ContactID = curr.ContactID)
    WHERE (curr.Tag != 'Key' OR (curr.Tag = 'Key' AND prev.Tag is null))
    
    UNION ALL
    
    SELECT prev.*
    FROM snapshot AS prev
    LEFT JOIN current_week AS curr ON (curr.AccountID = prev.AccountID AND curr.ContactID = prev.ContactID)
    WHERE curr.Tag is null
    
    ORDER BY AccountID;
    

    您可以在dbfiddle上测试它

    我认为即使您对1)和2)的查询也不正确。你确定你得到了正确的结果吗?对于3)只需做一个
    t2.Tag!='键“
    您已经给出了示例表结构,但没有给出这两个表的示例数据,也没有给出这两个表的示例数据以及这三个场景中每个场景的预期结果——请您使用
    当前(u week
    快照
    数据集更新您的问题,好吗,期望的结果呢?我为迟来的回应道歉。我的逻辑实际上是错误的,但你给我指出了正确的方向。非常感谢。接受并投票通过。@AB Thx无论如何。顺便说一句,你可能已经知道了。但是要认识到
    UNION
    UNION-ALL
    之间的区别。
    联合
    可能会稍微慢一点,因为它必须对组合结果进行排序,以便能够删除重复记录。而
    联合ALL
    只是将它们粘在一起,不管是否重复。