【问题标题】:Why I got incorrect calculation of COUNT DISTINCT with GROUP BY?为什么我用 GROUP BY 计算的 COUNT DISTINCT 不正确?
【发布时间】:2019-05-02 13:00:27
【问题描述】:

我有一张表 INTERACTIONS

CustomerID | Channel | Response
-----------+---------+----------
 245       | SMS     | Accept   
 245       | PUSH    | Ignore   
 247       | SMS     | Accept   
 249       | PUSH    | Ignore   

当我提出要求时

SELECT COUNT(DISTINCT CUSTOMERID) AS Customers 
FROM INTERACTIONS;

我得到结果7440

当我通过频道分组查询,然后计算所有组的总和:

    SELECT SUM(CUSTOMERS) 
    FROM 
        (SELECT 
             CHANNEL,
             COUNT(DISTINCT CUSTOMERID) AS Customers 
         FROM 
             INTERACTIONS
         GROUP BY 
             CHANNEL);

我得到结果9993

为什么?怎么了?我希望所有客户的数量相同。

【问题讨论】:

  • 一些客户在多个渠道中。

标签: sql group-by count distinct


【解决方案1】:

它就在您的示例数据中。不同的客户是:

245, 247, 249

当您按渠道分组时,245 客户会分别针对 PUSH 和 SMS 显示:

SMS  | 245, 247
PUSH | 245, 249

因此COUNT(DISTINCT x) GROUP BY y 可能大于COUNT(DISTINCT x) -- NO GROUP BY

【讨论】:

    【解决方案2】:

    您得到了不同的结果,因为不同的 CHANNEL PUSHSMS 包含相同的 id 245 ,因此当您在第一个查询中 COUNT(DISTINCT CUSTOMERID) 时它会返回 1 但是当 您通过 CHANNEL 应用了组,它将返回每个组 1,因此您的第二个查询 245 id 将使 push=1 and sms=1 和最终查询 sum() 将其变为 2,这是不同的结果

    【讨论】:

      【解决方案3】:
      SELECT CHANNEL,
      COUNT(DISTINCT CUSTOMERID) AS Customers 
      FROM INTERACTIONS
      GROUP BY CHANNEL
      

      该查询为您提供不同的CUSTOMERID 每个频道。不同的 Channel 中可能存在相同的 CUSTOMERID 值,因此它们会在最终总和(9993)中被计算多次。

      您可以通过将查询转换为这个来检查这一点,这将为您提供每个 CUSTOMERID 的频道数:

      SELECT CUSTOMERID,
      COUNT(DISTINCT CHANNEL) AS Channels
      FROM INTERACTIONS
      GROUP BY CHANNEL
      HAVING COUNT(DISTINCT CHANNEL) > 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-16
        • 2020-10-30
        • 2014-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多