Google BigQuery [Стандартный SQL] - объединять строки только в выбранных столбцах, объединять массивы с остальными - PullRequest
1 голос
/ 28 апреля 2020

Стандарт SQL

Привет всем,

У меня есть большая таблица запросов, примерно такая:

team_id, channel_id, value_1, value_2,...
A        1111        xxx      yyy
B        1111        xxx      yyy
C        2222        uuu      vvv
D        2222        uuu      vvv
E        3333        grr      sss

Итак, как вы можете видеть, в настоящее время, все индексируется командой team_id, в то время как все данные с одинаковым идентификатором канала совпадают. Мне нужно, чтобы данные были проиндексированы channel_id. Результат должен выглядеть следующим образом:

team_id, channel_id, value_1, value_2,...
[A,B]    1111        xxx      yyy
[C,D]    2222        uuu      vvv
[E]      3333        grr      sss

Таким образом, строки с одинаковым идентификатором канала уменьшаются до одной строки, а team_id объединяется в массив. Это возможно? Я все еще довольно плохо знаком с SQL / BigQuery и не знаю, как это сделать. Буду рад за помощь!

Большое спасибо заранее!

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Я думаю, вы просто хотите агрегацию:

select array_agg(team_id) as team_ids, channel_id, value_1, value_2
from t
group by channel_id, value_1, value_2;
0 голосов
/ 28 апреля 2020

Ниже для BigQuery Standard SQL

... все данные с одинаковым channel_id одинаковы ...

Таким образом, ниже устраняются потребности в явном перечислении всех этих столбцов, поэтому используйте один и тот же код для любого количества этих столбцов и их имен

#standardSQL
SELECT ARRAY_AGG(team_id) AS team_id, ANY_VALUE(str).*
FROM (
  SELECT team_id,
    (SELECT AS STRUCT * EXCEPT(team_id) FROM UNNEST([t])) AS str
  FROM `project.dataset.table` t
)
GROUP BY TO_JSON_STRING(str)    

Зависит от ваших предпочтений кодирования - вы можете использовать реорганизованную версию выше

#standardSQL
SELECT ARRAY_AGG(team_id) AS team_id, 
  ANY_VALUE((SELECT AS STRUCT * EXCEPT(team_id) FROM UNNEST([t]))).*
FROM `project.dataset.table` t
GROUP BY TO_JSON_STRING((SELECT AS STRUCT * EXCEPT(team_id) FROM UNNEST([t])))

В обоих случаях, если обратиться к образцу данных по вашему вопросу - вывод будет следующим:

Row team_id channel_id  value_1 value_2  
1   A       1111        xxx     yyy  
    B                
2   C       2222        uuu     vvv  
    D                
3   E       3333        grr     sss  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...