Map的sql精度

iovurdzv  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(256)

如果两个表共享一个公共id,我将它们连接起来。

select *
from my_table m
join other_table o
on m.mid = o.oid

这给了我一个新的表,我称之为新表。我选择一个列(新列)来获取有关它的更多信息

select count(new_col)
from new_table

给我312。当我发现不同的值

select count( distinct new_col)
from new_table

我得到284分。如果不同计数和常规计数结果不同,则表示 other_table 它的id有重复的值。在连接过程中,重复的值与 mid 多次。我想知道他们有多少身份证 mid 只Map到中的一个id oid 以及有多少个一对多匹配,然后计算1-1Map和多-1Map的平均值。

kpbpu008

kpbpu0081#

我不得不在这里做一些假设,因为您(在标记中)没有提到您正在使用哪个数据库(mysql?postgresql?,??)并且您没有显式地声明两个表中是否可以有重复的id(我推断只有另一个表有重复的id)。
所以我举了一个这样的例子:

.-----.-----.
| mid | oid |
:-----+-----:
|   1 |   1 |
:-----+-----:
|   2 |   2 |
:-----+-----:
|   3 |   3 |
:-----+-----:
|   3 |   3 |
:-----+-----:
|   4 |   4 |
:-----+-----:
|   4 |   4 |
:-----+-----:
|   4 |   4 |
:-----+-----:
|   5 |   5 |
'-----'-----'

并用下面的sql进行了测试:

WITH stats_base
     AS (SELECT mid, ocount
         FROM   my_table m
                JOIN (SELECT oid, COUNT(*) AS ocount
                      FROM   other_table
                      GROUP  BY oid) o
                  ON m.mid = o.oid)
SELECT SUM(CASE WHEN ocount = 1 THEN 1 ELSE 0 END) AS count_ones,
       SUM(CASE WHEN ocount = 1 THEN 0 ELSE 1 END) AS count_dups,
       SUM(CASE WHEN ocount = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*) AS percent_ones
FROM   stats_base

结果是:

.------------.------------.-----------------.
| count_ones | count_dups |  percent_ones   |
:------------+------------+-----------------:
|          3 |          2 | 60.000000000000 |
'------------'------------'-----------------'

我相信这和你想要的很接近?

相关问题