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'
每个星期一,我都要汇报工作
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
只是将它们粘在一起,不管是否重复。