Как сравнить две привязки данных схемы в SQL? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть две таблицы:

Current_Ranking:

id   rank
1     20
2     25
3     26
4     17

Previous_Ranking

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

Я хочу получить в результате все записи в Previous_Ranking, которые не отображаются в Current_Ranking (означает новый идентификатор) и все записи о том, что их ранг в 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 ]

1 голос
/ 18 апреля 2019

Я бы просто сделал:

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
1 голос
/ 18 апреля 2019

Вы можете использовать левое соединение по двум критериям:

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 в качестве имени для столбцов и таблиц.

0 голосов
/ 18 апреля 2019

Вы также можете использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...