Рассчитать процентили, сколько раз идентификатор файла из таблицы1 существует в таблице2? - PullRequest
0 голосов
/ 04 марта 2020

У меня есть две такие таблицы:

table1

email,                   file_id
useremail1@mydomain.com, qUvGRdixBN
useremail2@mydomain.com, aIirUAqKwm
useremail3@mydomain.com, njeOMonYyb

table2

file_id,    event_name
qUvGRdixBN, download
aIirUAqKwm, view
njeOMonYyb, print

Из которых мне нужно знать 1) адреса электронной почты с наибольшим количеством файлов (независимо от активности в таблице 2) или адресов электронной почты с более чем X файлами 2) Для пользователей, которые соответствуют предыдущим критериям, необходимо знать общее количество файлов из таблицы 1, количество файлов без каких-либо событий в таблице 2, и в идеале некоторые процентили, такие как мин / макс и .01 .1 .5 .9 .95. Цель здесь состоит в том, чтобы составить график / график результатов, чтобы проиллюстрировать учетные записи и степень активности журналов для принадлежащих им файлов по сравнению с общим числом принадлежащих им файлов. :

output_table

email, total_num_files, total_num_files_no_logs, percentile_min, percentile_max, percentile_05, ...

Чтобы определить 100 лучших пользователей, я предложил следующее:

SELECT email, count(distinct(file_id)) numFiles
FROM `table1` 
GROUP BY email
ORDER BY numFiles DESC
LIMIT 100

Затем для идентификации файлов без активности журнала я сохранил, что первый в виде представления и создал второй запрос, подобный следующему:

WITH top_100_users AS (
  SELECT email
  FROM `top_100_fileowners_view`
)
SELECT u.email, f.file_id, f.name, f.mimeType
FROM top_100_users u
LEFT JOIN `table1` f
ON f.email = u.email
LEFT JOIN `table2` a
ON a.file_id = f.file_id
WHERE a.drive.doc_id is null

Это говорит мне, сколько файлов у пользователей с наибольшим количеством файлов без активности журнала в table2, но в виде отдельной таблицы как первая запрос. Теперь, чтобы добавить в процентили, и я полностью потерян. Подозреваю, что попасть туда, где я нахожусь, было не самым эффективным sql. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 05 марта 2020

На основании вашего комментария я смог написать код SQL в BigQuery, чтобы создать общую таблицу, которая поможет вам визуализировать ваши процентили.

Я выполнил некоторые шаги, которые вы опубликовали в своем вопросе описание. Однако я работал с временными таблицами.

Данные, которые я использовал для воспроизведения дела, следующие:

  • Таблица 1: t1email (обратите внимание, что я добавил некоторые данные для дальнейшего уточнения)

enter image description here

  • Таблица 2: t2logs (обратите внимание, что я добавил некоторые данные для дальнейшего уточнения)

enter image description here

Сценарий, который я написал, выглядит следующим образом:

with t1_count as (
SELECT  email , count(file_id) as file_count
FROM `test-proj-261014.sample.t1email` as a
group by email
#you can use filter here "more thgan X files in count"
),

t2_count as (
SELECT email, file_id, COUNT(file_id) as file_count2 
FROM (SELECT t1.email, t2.file_id, FROM `test-proj-261014.sample.t2logs`t2 LEFT JOIN `test-proj-261014.sample.t1email` t1 ON t1.file_id = t2.file_id  )  
GROUP BY file_id, email
),

numberFiles_fromt1 as (
select t1.email,t2.file_id 
FROM `test-proj-261014.sample.t1email`t1 INNER JOIN `test-proj-261014.sample.t2logs` t2 ON t1.file_id=t2.file_id
), 

filesWithoutEvent_t2 as (
SELECT t1.* from `test-proj-261014.sample.t1email`t1 LEFT JOIN `test-proj-261014.sample.t2logs`t2 ON t1.file_id=t2.file_id WHERE t2.file_id IS NULL
)

SELECT t1.email, COALESCE(t1.file_id,t2.file_id) as file_id,file_count, file_count2  
FROM `test-proj-261014.sample.t1email` t1 FULL JOIN `test-proj-261014.sample.t2logs` t2 ON t1.file_id=t2.file_id
LEFT JOIN t1_count ON t1_count.email=t1.email
LEFT JOIN t2_count ON t2_count.file_id = t2.file_id 
ORDER BY email
#where email is null file is not in table1, just in the logs
#where file_count2 is null, file_id is not in the logs
#where file_count is null, file_id is not in the table1
#you can see multiple repeated emails, it is because they have diferent file count in t2logs, this would help you calculate more accurate percentiles.

И вывод:

enter image description here

Как написано в комментариях внутри кода, в окончательном виде дублируются электронные письма table, поскольку столбец file_count в table1 (t1email) отличается от file_count2 в table2 (t2logs). Это происходит потому, что file_count2 - это другой показатель c, который учитывает каждый отдельный файл. Более того, нулевые значения также дают нам ценную информацию, например, когда электронная почта является пустым файлом, ее нет в table1 , просто в журналах. Тем не менее, вы можете использовать фильтры WHERE для выбора и вычисления желаемых процентилей на основе столбцов file_count и file_count2 .

Как указано в разделе комментариев, при необходимости я могу загрузить ответ с процентилями, которые вы рассчитываете.

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