我有两个表:
当前排名:
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来完成。
答案 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;
注意: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
更清晰。