【发布时间】:2021-02-06 01:01:21
【问题描述】:
有哪些方法可以计算服务器中两个不同表(表i 和h)的匹配和不匹配记录。例如,i.id = h.id 计算匹配记录,i.id != h.id 计算不匹配记录。
逻辑在我的脑海中是有道理的,但我正在努力想出代码。我试过case 声明,但没有奏效。我只需要表h中匹配记录的总数和不匹配记录的总数。
【问题讨论】:
标签: mysql sql join count databricks
有哪些方法可以计算服务器中两个不同表(表i 和h)的匹配和不匹配记录。例如,i.id = h.id 计算匹配记录,i.id != h.id 计算不匹配记录。
逻辑在我的脑海中是有道理的,但我正在努力想出代码。我试过case 声明,但没有奏效。我只需要表h中匹配记录的总数和不匹配记录的总数。
【问题讨论】:
标签: mysql sql join count databricks
我不确定您到底需要什么,但也许类似的东西可以帮助您:
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;
上面的查询将告诉两个表中存在多少个id,以及表h中有多少个id在表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;
上面的查询将告诉两个表中存在多少个id,以及表i中有多少个id在表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;
上面的查询将告诉两个表中存在多少个id,以及笛卡尔积中存在多少个分歧。
【讨论】:
我认为您可能想先在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
【讨论】: