Почему я получил неправильный расчет COUNT DISTINCT с GROUP BY? - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть таблица ВЗАИМОДЕЙСТВИЯ

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 голосов
/ 30 ноября 2018

вы получили другой результат, потому что разные CHANNEL PUSH и SMS содержат один и тот же идентификатор 245, в результате, когда вы COUNT(DISTINCT CUSTOMERID) в 1-м запросе, он вернет 1, но когда вы применили группу по CHANNEL, он вернется по группе 1таким образом, ваш второй запрос 245 id будет равен push=1 and sms=1, а итоговый запрос sum () будет равен 2, что является другим результатом

0 голосов
/ 30 ноября 2018
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
0 голосов
/ 30 ноября 2018

Это прямо в ваших данных образца.Различными клиентами являются:

245, 247, 249

Когда вы группируете по каналу, клиент 245 появляется отдельно для PUSH и SMS:

SMS  | 245, 247
PUSH | 245, 249

Таким образом, COUNT(DISTINCT x) GROUP BY y может быть больше, чем COUNT(DISTINCT x) -- NO GROUP BY.

...