#mysql #sql #join #count #databricks
#mysql #sql #Присоединиться #подсчет #databricks
Вопрос:
Каковы способы подсчета совпадающих и несовпадающих записей из двух разных таблиц в разделе (таблица i
и h
). Например, подсчитайте совпадающие записи, если i.id = h.id
и и подсчитайте несоответствующие записи, если i.id != h.id
.
Логика имеет смысл в моей голове, но я изо всех сил пытаюсь придумать код. Я пробовал case
инструкцию, но это не сработало. Мне нужно только общее количество совпадающих записей и общее количество не совпадающих записей в таблице h
.
Ответ №1:
Я не уверен, что именно вам нужно, но, возможно, что-то подобное может вам помочь:
SELECT
COUNT(i.id) AS matching_count,
COUNT(h.id) - COUNT(i.id) AS non_matching_count
FROM h
LEFT JOIN i ON h.id = i.id;
Приведенный выше запрос сообщит, сколько идентификаторов существует в обеих таблицах, и сколько идентификаторов в таблице h
не существует в таблице i
.
Или обратная логика:
SELECT
COUNT(h.id) AS matching_count,
COUNT(i.id) - COUNT(h.id) AS non_matching_count
FROM i
LEFT JOIN h ON i.id = h.id;
Приведенный выше запрос сообщит, сколько идентификаторов существует в обеих таблицах, и сколько идентификаторов в таблице i
не существует в таблице h
.
Или, может быть, вы хотите что-то подобное:
SELECT
COUNT(CASE WHEN h.id = i.id THEN 1 ELSE NULL END) AS matching_count,
COUNT(CASE WHEN h.id != i.id THEN 1 ELSE NULL END) AS non_matching_count
FROM h, i;
Приведенный выше запрос покажет, сколько идентификаторов существует в обеих таблицах и сколько расхождений существует в декартовом произведении.
Ответ №2:
Я думаю, вы можете сначала подвести итоги на id
уровне:
select id, max(in_i) as in_i, max(in_h) as in_h
from ((select id, 1 as in_i, 0 as in_h
from i
) union all
(select id, 0, 1
from h
)
) ih
group by id;
Затем обобщите это:
select count(*) as num_total_ids,
sum(in_i) as num_i, sum(in_h) as num_h,
sum(in_i * (1 - in_h)) as in_i_only,
sum(in_h * (1 - in_i)) as in_h_only,
sum(in_i * in_h) as num_both,
from (select id, max(in_i) as in_i, max(in_h) as in_h
from ((select id, 1 as in_i, 0 as in_h
from i
) union all
(select id, 0, 1
from h
)
) ih
group by id
) i