У меня есть следующая таблица SQL:

user_id | device | num_uses
---------------------------
1       | phone  | 10
1       | tv     | 5
2       | phone  | 15
3       | tv     | 45

Я хочу создать запрос, который вернет количество пользователей на устройство, а также общее количество уникальных пользователей.

Можно ли сделать это с помощью одного запроса или единственный вариант - создать 2 запроса: один для количества пользователей на устройство, а другой - для получения определенного количества пользователей?

Запрос, который я должен получить, чтобы получить количество пользователей по устройству:

select count(user_id), device from usage group by device;

Что дает мне:

count  | device
---------------
2      | phone
2      | tv

Ожидаемый результат:

category_count | device   | total_distinct_users
------------------------------------------------
2              | phone    |  3
2              | tv       |  3
sql
0
jcm 7 Сен 2016 в 05:25

4 ответа

Лучший ответ

Вы хотите count(distinct). Думаю так:

select device, sum(uses) as num_uses, count(*) as num_users,
       count(distinct user_id) as num_distinct_users
from usage
group by device;

РЕДАКТИРОВАТЬ:

Если вам нужно количество пользователей на устройство и общее количество уникальных пользователей, вы можете:

select u.device, count(*) as num_users,
       uu.num_distinct_users
from usage u cross join
     (select count(distinct user_id) as num_distinct_users from usage) uu
group by device, uu.num_distinct_users;
1
Gordon Linoff 7 Сен 2016 в 02:28

Я предполагаю, что вы хотите также включить count с distinct:

select count(user_id), 
       count(distinct user_id), 
       device 
from usage 
group by device
0
sgeddes 7 Сен 2016 в 02:27

Пытаться:

SELECT COUNT(DISTINCT user_id), device 
FROM `usage`
GROUP BY device

Сценарий: http://sqlfiddle.com/#!9/50269c/5

0
designcise 7 Сен 2016 в 02:40

Мы также можем сделать это следующим образом:

SELECT u.device, 
    COUNT(u.user_id) category_count, 
    MAX(t.tot) total_distinct_users
FROM #usage u
OUTER APPLY(SELECT COUNT(DISTINCT USER_ID) tot FROM #usage) t
GROUP BY device
0
Susang 7 Сен 2016 в 03:49