Здесь действительно два вопроса
- Я хочу извлечь всех эксклюзивных посетителей каждого домена по сравнению с другими доменами ...
- Я хочу что-то вроде сводной таблицы
Позвольте мне ответить на ваши вопросы один за другим
Итак,
Как извлечь всех эксклюзивных посетителей каждого домена по сравнению с другими доменами ...
Ниже приведен стандарт SQL для BigQuery, в котором выровнена версия вашей матрицы
#standardSQL
WITH `project.dataset.your_table` AS (
SELECT 1 userid, 'A' domain UNION ALL
SELECT 1, 'B' UNION ALL
SELECT 1, 'C' UNION ALL
SELECT 2, 'A' UNION ALL
SELECT 2, 'B' UNION ALL
SELECT 3, 'A' UNION ALL
SELECT 2, 'C'
), temp AS (
SELECT DISTINCT userid, domain
FROM `project.dataset.your_table`
)
SELECT
a.domain domain_a,
b.domain domain_b,
COUNT(DISTINCT a.userid) - COUNTIF(a.userid = b.userid) count_of_not_in
FROM temp a
CROSS JOIN temp b
GROUP BY a.domain, b.domain
-- HAVING count_of_not_in > 0
Это приведет к
Row domain_a domain_b count_of_not_in
1 A A 0
2 A B 1
3 A C 1
4 B A 0
5 B B 0
6 B C 0
7 C A 0
8 C B 0
9 C C 0
Я думаю, что в реальной жизни у вас не будет много нулей в этих данных, поэтому, если вы хотите сжать эту сплющенную версию - просто раскомментируйте строку с HAVING ...
, чтобы вы получили "компактную" версию
Row domain_a domain_b count_of_not_in
1 A B 1
2 A C 1
Ради упражнений и веселья, попробуйте другой подход ниже, который дает точно такой же результат, но совершенно другим способом
#standardSQL
WITH `project.dataset.your_table` AS (
SELECT 1 userid, 'A' domain UNION ALL
SELECT 1, 'B' UNION ALL
SELECT 1, 'C' UNION ALL
SELECT 2, 'A' UNION ALL
SELECT 2, 'B' UNION ALL
SELECT 3, 'A' UNION ALL
SELECT 2, 'C'
), domains AS (
SELECT domain, ARRAY_AGG(DISTINCT userid) users
FROM `project.dataset.your_table`
GROUP BY domain
)
SELECT
a.domain domain_a, b.domain domain_b,
ARRAY_LENGTH(a.users) -
(SELECT COUNT(1)
FROM UNNEST(a.users) user_a
JOIN UNNEST(b.users) user_b
ON user_a = user_b
) count_of_not_in
FROM domains a
CROSS JOIN domains b
-- ORDER BY a.domain, b.domain
Сейчас
Как повернуть результат выше, чтобы получить реальную матрицу?
В идеале поворот должен выполняться вне BigQuery в любом инструменте визуализации, который вы обычно используете. Но если по какой-либо причине вы хотите, чтобы это было сделано в BigQuery - это выполнимо, и здесь, в SO, огромное количество вопросов, связанных с этим. Один из самых последних, за которые я отправил ответ, - https://stackoverflow.com/a/50300387/5221944.
Он показывает, как генерировать / производить сводный запрос для достижения желаемой матрицы
Это относительно просто и может быть выполнено вручную как двухэтапный процесс (шаг 1 - сгенерировать сводный запрос и шаг 2 - запустить сгенерированный запрос) или может быть реализован с использованием любого client
на ваш выбор