#sql #arrays #google-bigquery
#sql #массивы #google-bigquery
Вопрос:
Итак, у меня есть два столбца с group_user_id и массив user_ids. Конечная цель — объединить массив user_id_list на основе транзитивных отношений между различными идентификаторами пользователя.
Например, в настоящее время у меня есть данные в следующем формате
group_user_id user_id_list
123 123
456
345
234
567 567
678
456
и я пытаюсь добиться этого, основываясь на отношениях 123 — 456 — 567 и, следовательно, присоединяется к user_id_list как из group_user_id 123, так и из 567. PS: порядок идентификаторов пользователя в user_id_list не имеет значения.
group_user_id user_id_list
123 123
456
345
234
567
678
567 567
123
345
234
678
456
Я понимаю, что это может быть намного проще с чем-то вроде GraphDB. Но я застрял в Google-bigquery
Комментарии:
1. Для этого требуется рекурсия или цикл. BigQuery не поддерживает это напрямую
select
, но вы можете написать цикл, используя язык сценариев.
Ответ №1:
Я потратил на это всего несколько минут, но, надеюсь, это то, что вы ищете, и я не совсем понял ваш вопрос.
Вы выполняете самосоединение в user_id_list
столбце, а затем возвращаетесь в исходную таблицу с новым group_id
полем из объединения:
SELECT distinct
v1.group_id v1_group_id,
v3.user_id_list v3_user_id_list
FROM
simon_test.test_data v1
JOIN simon_test.test_data v2
on v1.user_id_list = v2.user_id_list
join simon_test.test_data v3
on v2.group_id = v3.group_id
order by v1_group_id, v3_user_id_list;
Приведенное выше приводит к:
|---------- --------------|
| group_id | user_id_list |
|---------- --------------|
| 123 | 123 |
| | 234 |
| | 345 |
| | 456 |
| | 567 |
| | 678 |
| 567 | 123 |
| | 234 |
| | 345 |
| | 456 |
| | 567 |
| | 678 |
|---------- --------------|