Как в BigQuery работает более 1 таблицы в предложении FROM - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь переместить мои столбцы из

id, english, math
1,100,200
2,50,100

в таблицу, которая выглядит как

id, subject, marks
1, english, 100
1, math, 200
2, english, 50
2, math, 100

Я играл с этой временной таблицей в BigQuery, и у меня есть этот код .

with marks as (
select 1 as id, 200 as math, 100 as english union all
select 2 as id, 100 as math, 50 as english 
)

, temp as 
(
select 'math' as subject union all
select 'english' as subject
)


select * from marks, temp

Я не понял, как работает BigQuery, когда вы упоминаете 2 таблицы рядом. Делает ли это какое-то внутреннее соединение?

enter image description here

Ответы [ 2 ]

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

Ниже для BigQuery Standard SQL и не требует какой-либо явной ссылки на имена столбцов - поэтому достаточно c достаточно для таблиц с любым количеством столбцов - в этом случае субъекты

#standardSQL
SELECT id, subject, CAST(marks AS INT64) AS marks
FROM `project.dataset.table` t,
UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(t), '[{}"]', ''))) kv,
UNNEST([STRUCT(SPLIT(kv, ':')[OFFSET(0)] AS subject, SPLIT(kv, ':')[OFFSET(1)] AS marks)])
WHERE NOT subject = 'id'   

, если применить к образцу данных из вашего примера - вывод

Row id  subject marks    
1   1   english 100  
2   1   math    200  
3   2   english 50   
4   2   math    100  
1 голос
/ 16 апреля 2020

Это перекрестное соединение. Это то, что вы хотите:

with marks as (
  select 1 as id, 200 as math, 100 as english union all
  select 2 as id, 100 as math, 50 as english 
)
select id, subject, value
from marks
join unnest([struct('math' as subject, math as value), struct('english' as subject, english as value)]) as s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...