【问题标题】:Email Duplicate Percentage calculation电子邮件重复百分比计算
【发布时间】:2020-03-21 04:54:09
【问题描述】:

我有一张像下面这样的表格

email            table_name
a@mail.com         a1
a@mail.com         b2
b@mail.com         a1
c@mail.com         c1
d@mail.com         d1
e@mail.com         e
g@mail.com         e
g@mail.com         e
e@mail.com         f
g@mail.com         g

那么从这里我如何计算每个表的电子邮件重复百分比

table_name total_email  duplicate_email  duplicate_percentage
a1           2                1             50%
b2           1                1             100%
c1           1                0             0
d1           1                0             0
e            2                2             100%
f            1                1             100%
g            1                1             100%

【问题讨论】:

  • 您的预期结果没有意义(至少对我而言)。为什么b2 1 1 100%? (和其他人)。
  • @forpas b2 有电子邮件 a@mail.com,它在表 a1 中重复,并且 emal 始终是不同的计数,所以就像这样

标签: sql sql-server tsql group-by window-functions


【解决方案1】:

这是我的尝试。设置:

DECLARE @Test TABLE (
    email VARCHAR(100),
    table_name VARCHAR(100))

INSERT INTO @Test (
    email,
    table_name)
VALUES
    ('a@mail.com', 'a1'),
    ('a@mail.com', 'b2'),
    ('b@mail.com', 'a1'),
    ('c@mail.com', 'c1'),
    ('d@mail.com', 'd1'),
    ('e@mail.com', 'e'),
    ('g@mail.com', 'e'),
    ('g@mail.com', 'e'),
    ('e@mail.com', 'f'),
    ('g@mail.com', 'g')

解决方案:

;WITH DupDetail AS
(
    SELECT
        T.email,
        T.table_name,
        IsDup = CASE WHEN COUNT(*) OVER (PARTITION BY T.email) > 1 THEN 1 ELSE 0 END
    FROM
        @Test AS T
),
DupStats AS
(
    SELECT
        T.table_name,
        total_email = COUNT(DISTINCT(T.email)),
        duplicate_email = COUNT(DISTINCT(CASE WHEN T.IsDup = 1 THEN T.email END))
    FROM
        DupDetail AS T
    GROUP BY
        T.table_name
)
SELECT
    D.table_name,
    D.total_email,
    D.duplicate_email,
    duplicate_percentage = CONVERT(
        DECIMAL(5,2), 
        D.duplicate_email * 100.0 / D.total_email)
FROM
    DupStats AS D

IsDup 列将邮件标记为 1,如果它在任何表中重复,那么对于所有表中重复但按每个表分组的所有电子邮件,duplicate_emailCOUNT DISTINCT名字。

结果:

table_name  total_email duplicate_email duplicate_percentage
a1          2           1               50.00
b2          1           1               100.00
c1          1           0               0.00
d1          1           0               0.00
e           2           2               100.00
f           1           1               100.00
g           1           1               100.00

【讨论】:

    【解决方案2】:

    你可以使用窗口函数,然后聚合:

    select 
        table_name,
        sum(cnt1) duplicate,
        sum(1.0 * cnt1) / cnt2 percentage
    from (
        select
            t.*,
            count(*) over(partition by email) - 1 cnt1,
            count(*) over(partition by table_name) cnt2
        from mytable t
    ) t
    group by table_name, cnt2
    order by table_name
    

    Demo on DB Fiddle

    表名 |重复 |百分比 :--------- | --------: | :--------- a1 | 1 | 0.500000 b2 | 1 | 1.000000 c1 | 0 | 0.000000 d1 | 0 | 0.000000

    【讨论】:

    • 我已经编辑了更多数据以便更好地理解这个答案并没有给出正确的结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多