Как объединить данные нескольких строк на основе отношений

#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 |
|---------- --------------|