SQL 统计一组数据中的记录数与另一组数据的比较,并以百分比表示

SQL count number of records in one set of data compared to another and present as a percentage

我想计算数据 B 与数据 A 中在 2 个关键变量上不匹配的唯一记录数,并将结果显示为数据 B 中唯一记录总数的百分比。

Data A:              Data B:
    key1 key2          key1 key2
    1    a             1    a
    2    a             2    a
    2    b             2    b
    3    c             2    d
                       2    b
                       2    d

我的代码如下:

SELECT 100 * (SELECT count(DISTINCT b.key2)) / (SELECT COUNT(DISTINCT a.key2)) as output
FROM dataA a LEFT JOIN dataB b
ON a.key1 = b.key1 AND a.key2 = b.key2

根据以上数据,我希望得到 1 / 4 的结果,其中分子表示数据 B 中不存在于数据 A 中的 (2, d) 值,分母是按键的唯一记录在数据 B 中。代码目前不起作用,现在我已经将 DISTINCT 放入其中,所以我有点迷路了。

这是在 Microsoft SQL 服务器上测试的。我希望它也能在 Spark 中工作。

 SELECT
        100 * (Total - Matching) / Total
    FROM (
    SELECT
        (SELECT COUNT(*) FROM (SELECT DISTINCT * FROM DataB) t) AS [Total],
        (SELECT COUNT(*) FROM (SELECT DISTINCT DataB.Key1, DataB.Key2 FROM DataB INNER JOIN DataA ON DataB.Key1 = DataA.Key1 AND DataA.Key2 = DataB.Key2 ) u) AS [Matching]) v

假设 DataA 不包含重复行,您必须执行 LEFT 连接 DataBDataA 并聚合:

select avg(case when a.key1 is null then 1.0 else 0 end) output
from (select distinct * from DataB) b left join DataA a
on a.key1 = b.key1 and a.key2 = b.key2

如果DataA可能包含重复行,则:

select avg(case when a.key1 is null then 1.0 else 0 end) output 
from (select distinct * from DataB) b 
left join (select distinct * from DataA) a
on a.key1 = b.key1 and a.key2 = b.key2

参见 demo(对于 MySql 但它是标准的 SQL)。
结果:

> | output |
> | -----: |
> | 0.2500 |