Как объединить значение нескольких строк в один столбец / строку в BigQuery - PullRequest
0 голосов
/ 18 марта 2020

У меня есть примеры данных ниже, мне нравится объединять все множители gest_win и в один столбец для игрока 1083987121!

select * from player;

player_key, country, biggest_win, multiplier, date
1083987121, USD, 490.2, 163.4, 2020-03-17
1083987121, USD, 256.0, 128.0, 2020-03-17
1083987121, USD, 210.0, 70.0, 2020-03-17

Что я ожидание после слияния

1083987121, USD, 490.2#256.0#256.0 163.4#128.0#70.0, 2020-03-17
1083987121, USD, 490.2#256.0#256.0 163.4#128.0#70.0, 2020-03-17
1083987121, USD, 490.2#256.0#256.0 163.4#128.0#70.0, 2020-03-17

У кого-нибудь есть хорошее решение для этого? Я пробовал функцию XML, кажется, она не работает на BigQuery

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT player_key, country, 
  STRING_AGG(CAST(biggest_win AS STRING), '#') biggest_win, 
  STRING_AGG(CAST(multiplier AS STRING), '#') multiplier, 
  date 
FROM `project.dataset.player`
GROUP BY player_key, country, date  

с выводом

Row player_key  country biggest_win     multiplier      date     
1   1083987121  USD     490.2#256#210   163.4#128#70    2020-03-17   

Примечание: на основе вашего I'm expecting after merge примера - я предполагаю, что вы хотите получить результат в комбинации - игрок, страна и дата

Мне было интересно, хочу ли я напечатать все строки

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

#standardSQL
SELECT player_key, country, 
  STRING_AGG(CAST(biggest_win AS STRING), '#') OVER(PARTITION BY player_key, country, date) biggest_win, 
  STRING_AGG(CAST(multiplier AS STRING), '#') OVER(PARTITION BY player_key, country, date) multiplier, 
  date 
FROM `project.dataset.player`  

, в этом случае соответствующий вывод будет

Row player_key  country biggest_win     multiplier      date     
1   1083987121  USD     490.2#256#210   163.4#128#70    2020-03-17   
2   1083987121  USD     490.2#256#210   163.4#128#70    2020-03-17   
3   1083987121  USD     490.2#256#210   163.4#128#70    2020-03-17

Чтобы объединить эти два новых столбца в один - используйте ниже

#standardSQL
SELECT player_key, country, 
  CONCAT(
    STRING_AGG(CAST(biggest_win AS STRING), '#') OVER(PARTITION BY player_key, country, DATE), ' ', 
    STRING_AGG(CAST(multiplier AS STRING), '#') OVER(PARTITION BY player_key, country, DATE) 
  ) combined_column, 
  DATE 
FROM `project.dataset.player`

с выходом

Row player_key  country combined_column             date     
1   1083987121  USD     490.2#256#210 163.4#128#70  2020-03-17   
2   1083987121  USD     490.2#256#210 163.4#128#70  2020-03-17   
3   1083987121  USD     490.2#256#210 163.4#128#70  2020-03-17       
1 голос
/ 18 марта 2020

Это ответ на оригинальную версию вопроса.

select player_key, max(country) as country,
       array_agg(biggest_win order by biggest_win desc),
       array_agg(multiplier order by biggest_win desc),
       max(date) as date
from t
group by player_key;

Примечание. Возвращает значения в массивах, а не в строках - с массивами работать намного проще. Однако вы также можете использовать string_agg():

select player_key, max(country) as country,
       string_agg(biggest_win, '#' order by biggest_win desc),
       string_agg(multiplier, '#' order by biggest_win desc),
       max(date) as date
from t
group by player_key, country;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...