Как мне сгруппировать в структуру в BigQuery? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть следующие данные:

player_id level talent_id
1         1     a
1         2     b
1         3     c
2         1     d
2         2     e

И я хочу сгруппировать по player_id и иметь строки в виде структур, со значениями level в качестве имен структурных полей:

player_id data
1         {_1 = a, _2 = b, _3 = c}
2         {_1 = d, _2 = e, _3 = null}

theСтолбец уровня всегда из набора {1, 2, 3}, но некоторые уровни могут отсутствовать (null)

До сих пор я получал агрегацию по player_id и с прикрепленным массивом результатов:

talents as (
  select
    p.player_id,
    array_agg(struct(p.level, p.talent_id)) as talents
  from source.player_talent p
  group by player_id
),

player_id data
1         [{1, a}, {2, b}, {3, c}]
2         {{1, d}, {2, e}]

теперь мне нужно сопоставить этот массив со структурой с фиксированными именами свойств _1, _2, _3

1 Ответ

0 голосов
/ 21 декабря 2018

Возвращает ожидаемые результаты:

WITH Players AS (
  SELECT 1 AS player_id, 1 AS level, 'a' AS talent_id UNION ALL
  SELECT 1, 2, 'b' UNION ALL
  SELECT 1, 3, 'c' UNION ALL
  SELECT 2, 1, 'd' UNION ALL
  SELECT 2, 2, 'e'
)
SELECT
  player_id,
  STRUCT(
    MAX(IF(level = 1, talent_id, NULL)) AS _1,
    MAX(IF(level = 2, talent_id, NULL)) AS _2,
    MAX(IF(level = 3, talent_id, NULL)) AS _3) AS data
FROM Players
GROUP BY player_id

Этот метод здесь известен как поворот (преобразование строк в столбцы).

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