我有两个表,current和prev。每天,curr都会被复制到prev,并成为新的prev。然后,从外部源更新curr。表具有相同的模式。我正在使用SQL的BQ风格。
表的粗略布局是主电子邮件作为唯一键,然后是订阅记录。同一用户(由主电子邮件标识)可以有多个历史订阅,尽管当前只有一个订阅是活动的。字段包括订阅开始日期、订阅金额、取消状态等。
我希望只选择两个表之间的差异,即只选择最近更改过的记录,例如开始日期,金额或取消状态。
然而,我在挣扎。我试过从两个表中选择DISTINCT,其中current .start_date!=prev。start_date(或任何其他感兴趣的字段),但它只是给我以前持有多个订阅的人。可能有一种方法可以使用PARTITION BY和ROW ORDER只返回最新的订阅,但我不确定如何做到这一点。
我也尝试过SELECT* FROM current EXCEPT DISTINCT SELECT* FROM prev,但我认为这只会给我新的而不是更新的行。
有人能给我指个正确的方向吗?提前感谢。一些表格数据-当前和预览都是这样的。在更新的情况下,在curr中创建一个新条目,Primary_Email保持不变。
primary_email | start_date | status | cancellation_type | amountfrequency | bundle | Mickey.mouse@gmail.com | 2020-10-14 | 活动 | 活动 | 300 | 每月 | Minnie.mouse@gmail.com |
---|---|---|---|---|---|---|
2021-01-12 | 取消次 | 12道明> | b | |||
Roger.rabbit@gmail.com | 2019-08-14 | 失败 | 后起动 | 25道明> | b | |
John.doe@gmail.com | 2020-04-24 | 活动 | 活动 | 555 | 每月 | |
Jane.doe@gmail.com | 2021-02-12 | 失败 | 后起动 | 15道明> | c |
我想你很接近了。您可以为每个select
添加条件,以确保您只考虑在两个表之间共享的电子邮件地址。
select *
from curr
where email in (select email from prev)
except
select *
from prev
where email in (select email from curr)