Подсчитайте количество человек в обеих группах - PullRequest
1 голос
/ 25 сентября 2019

У меня есть данные следующим образом:

Person  |  Group
-----------------
Andy    |  1
Andy    |  2
Doug    |  2
Jack    |  1
Carl    |  2
Joe     |  1
Joe     |  2

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

num_persons  |  num_persons_in_both_groups  |  overlap
--------------------------------------------------------
5            |  2                           |  40%

Я могу получить num_persons, но меня смущает num_persons_in_both_groups.Как я могу получить это с помощью SQL?Предполагая, что это MySQL.overlap просто.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 25 сентября 2019

Отличный вопрос!Попробуйте следующее:

SELECT SUM(GroupCount) AS num_persons
    , SUM(CASE WHEN PersonsInGroups > 1 THEN 1 ELSE 0 END) AS num_persons_in_both_groups
    , (SUM(CASE WHEN PersonsInGroups > 1 THEN 1 ELSE 0 END) / SUM(GroupCount))*100 AS overlap
FROM
(
SELECT COUNT(1) AS PersonsInGroups
    , 1 AS GroupCount
FROM t
GROUP BY Person
) x

За комментарий вы могли бы просто написать его так:

SELECT COUNT(1) AS num_persons
    , SUM(CASE WHEN PersonsInGroups > 1 THEN 1 ELSE 0 END) AS num_persons_in_both_groups
    , (SUM(CASE WHEN PersonsInGroups > 1 THEN 1 ELSE 0 END) / COUNT(1))*100 AS overlap
FROM
(
SELECT COUNT(1) AS PersonsInGroups
FROM t
GROUP BY Person
) x
2 голосов
/ 25 сентября 2019

Я бы порекомендовал два уровня агрегирования:

select count(*) as num_persons,
       sum(group_1 > 0 and group_2 > 0) as in_both,
       avg(group_1 > 0 and group_2 > 0) as ratio
from (select person,
             max( group = 1 ) as group_1,
             max( group = 2 ) as group_2
      from t
      group by person
     ) p

Мне это нравится, потому что он гибкий.

Однако вы также можете сделать это без подзапроса, предполагая ровно две группы:

select count(distinct person) as num_persons,
       count(*) - count(distinct person) as num_in_both,
       (count(*) - count(distinct person)) / count(distinct person) as ratio
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...