Bigquery - транспонировать массив в столбцы - PullRequest
0 голосов
/ 22 ноября 2018

Следующий запрос возвращает список пар ключ / значение:

SELECT ["name:apple", "color:red"] as fruit;

результат:
enter image description here

Есть ли способ транспонироватьданные, чтобы результаты были:
enter image description here

Обновление Я ищу обобщенное решение, где ключ и значение и массивдлина результатов неизвестна, т.е.: SELECT ["key0:val0", "key1:val1"...] as data;

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Полагаю, что BigQuery использовал бы подвыборы в массиве:

WITH t AS (SELECT * FROM UNNEST([ 
    struct(['name:apple','color:red'] AS fruit), 
    struct(['name:pear','color:purple'] AS fruit)
  ]) )

SELECT
  (SELECT SPLIT(f, ':')[SAFE_OFFSET(1)] FROM t.fruit f WHERE SPLIT(f, ':')[SAFE_OFFSET(0)]='name') AS name,
  (SELECT SPLIT(f, ':')[SAFE_OFFSET(1)] FROM t.fruit f WHERE SPLIT(f, ':')[SAFE_OFFSET(0)]='color') AS color
FROM t
0 голосов
/ 23 ноября 2018

Это должен быть быстрый способ достижения ваших результатов:

#standardSQL
with items as (
  select ["name:apple", "color:red"] p union all
  select ["name:orange", "color:orange"] UNION ALL
  select ["name:grapes", "color:green"]
),
arrayed as (
  select 
    array_agg(
       struct(
        if(split(p, ":")[offset(0)] = 'name', split(p, ":")[offset(1)], '') as name, 
        if(split(p, ":")[offset(0)] = 'color', split(p, ":")[offset(1)], '') as color 
      )
    ) item  from items, unnest(p) p
)
select 
  array((select i.name from unnest(item) i where i.name != '')) as name,
  array((select i.color from unnest(item) i where i.color != '')) as color
from arrayed
0 голосов
/ 22 ноября 2018

Не уверен, есть ли более лаконичный способ сделать это, но это работает

WITH CTE AS (
SELECT ["name:apple", "color:red"] as fruit
UNION ALL
SELECT ["name:pear", "color:green"]
),

CTE2 AS (
SELECT row_number() over () as rowNumber, fruit
FROM CTE
)

SELECT max(if(REGEXP_CONTAINS(fruit,'name:'),replace(fruit,'name:',''),null)) name,
  max(if(REGEXP_CONTAINS(fruit,'color:'),replace(fruit,'color:',''),null)) color
FROM CTE2,
UNNEST(fruit) as fruit
GROUP BY rowNumber
...