为什么我使用GROUP BY得出的COUNT DISTINCT计算不正确?

时间:2018-11-30 11:10:51

标签: sql group-by count distinct

我有一张桌子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

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

3 个答案:

答案 0 :(得分:2)

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

245, 247, 249

当您按渠道分组时,245客户针对PUSH和SMS分别出现:

SMS  | 245, 247
PUSH | 245, 249

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

该查询为您提供了不同的CUSTOMERID每个频道 。相同的CUSTOMERID值可能存在于不同的通道之间,因此它们在最终总和(9993)中将被计入多次。

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

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