Как подсчитать совпадающие и несовпадающие записи

#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