如何在SQL中比较两个架构数据快照?

时间:2019-04-18 06:39:33

标签: sql google-bigquery

我有两个表:

当前排名:

id   rank
1     20
2     25
3     26
4     17

上一个排名

id rank
1   20
2   26
3   18
4   17
5   5

因此,我希望获得上一个排名中未出现的所有记录 Current_Ranking(表示新ID),以及所有在Previous_Ranking中的排名与Current_Ranking不同的记录

所以预期结果是:

id rank
2   26
3   18
5   5

我该怎么做? 我知道我可以做到:

    SELECT   p.id, p.rank
    FROM     Previous_Ranking p
       LEFT JOIN Current_Ranking c USING (id)
    WHERE    c.id IS NULL

这应该给我所有新行。但是我如何从这里继续?

我正在使用BigQuery,因此可以使用本机SQL来完成。

3 个答案:

答案 0 :(得分:1)

您可以使用具有两个条件的左联接:

SELECT p.id, p.rank
FROM Previous_Ranking p
LEFT JOIN Current_Ranking c
    ON p.id = c.id
WHERE
    c.id IS NULL OR p.rank <> c.rank;

enter image description here

注意:RANK是许多SQL版本中的保留关键字(尽管在BigQuery中显然不是)。因此,您可能要避免使用RANK作为列和表的名称。

答案 1 :(得分:1)

我会简单地做:

select p.id, p.rank
from Previous_Ranking p
left join Current_Ranking c 
   ON p.id = c.id
where p.c is null
   OR p.rank !=  c.rank

答案 2 :(得分:0)

您也可以使用EXCEPT

select pr.*
from previous_ranking
except distinct
select r.*
from ranking;

not exists

select pr.*
from previous_ranking pr
where not exists (select 1
                  from ranking r
                  where r.id = pr.id and r.rank = pr.rank
                 );

我发现这两个版本都比left join更清晰。