我有一张桌子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
为什么?怎么了?我希望所有客户的数量都相同。
答案 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 PUSH
和SMS
包含相同的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